| Autor |
Nachricht |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
|
Klaus82 Mitglied
15:49:45 19.06.2012 Titel: |
|
Zitieren |
| SeppJ schrieb: |
(Achtung: Die mögliche Konvertierung der Streams nach void* führt manchmal zu interessanten Anfängerfehlern:
| C++: | std::stringstream foo("Hallo Welt");
std::cout << foo; | | Dies ist kein Compilerfehler, gibt aber nicht "Hallo Welt" aus, sondern einen kryptischen Zahlenwert.) |
Öm, ja. Das hatte ich gestern erst.
'unschuldig-an-die-Decke-guck-und-pfeif'
EDIT:
Na immerhin kann ich es reproduzieren:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream>
#include <string>
#include <fstream>
int main()
{
std::string filename("data.dat");
std::ifstream infile(filename.c_str());
std::cout << infile << std::endl;
return 0;
} | |
Dann kriege ich
Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte?
So wie ich z.B. einen Pointer derefenzieren muss, wenn ich das verändern möchte, worauf er zeigt?
Kann man das so vergleichen?
Gruß,
Klaus. |
Zuletzt bearbeitet von Klaus82 am 15:54:35 19.06.2012, insgesamt 1-mal bearbeitet |
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
|
Klaus82 Mitglied
16:19:33 19.06.2012 Titel: |
|
Zitieren |
Juhuuuu!!! Es funktioniert!
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream>
#include <string>
#include <fstream>
int main()
{
std::string filename("data.dat");
std::ifstream infile(filename.c_str());
std::string x_value, y_value;
for(int i = 0; i < 4; ++i)
{
infile >> x_value;
infile >> y_value;
std::cout << x_value << "\t" << y_value << std::endl;
}
return 0;
} | |
Liefert tatsächlich:
Genau was in der Datei steht!
Gruß,
Klaus. |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
|
Sone Mitglied
17:12:42 19.06.2012 Titel: |
|
Zitieren |
| Klaus82 schrieb: |
Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte? |
Hier der Standard:
| C++-Standard 27.4.4.3 Klausel 1 schrieb: | Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success then a value that will
evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type
returned shall not be convertible to int. |
Es ist also (seit C++11?) nicht definiert, welchen Rückgabetyp der überladene Operator hat. Lediglich, dass der Rückgabetyp zu bool konvertierbar sein muss. Außerdem ist festgehalten, dass der Typ nicht zu einem Integral (sprich: zu int, long, short, char oder long long) konvertierbar sein darf (was eigentlich schon impliziert, dass es sich um einen Pointer handeln soll, ich sehe keinen Grund es anders zu machen).
Lange Rede kurzer Sinn: Versuch ja nicht, etwas mit dieser Adresse zu machen |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
|
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5771
|
camper Mitglied
17:31:31 19.06.2012 Titel: |
|
Zitieren |
| Hacker schrieb: | | Klaus82 schrieb: |
Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte? |
Hier der Standard:
| C++-Standard 27.4.4.3 Klausel 1 schrieb: | Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success then a value that will
evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type
returned shall not be convertible to int. |
Es ist also (seit C++11?) nicht definiert, welchen Rückgabetyp der überladene Operator hat. Lediglich, dass der Rückgabetyp zu bool konvertierbar sein muss. Außerdem ist festgehalten, dass der Typ nicht zu einem Integral (sprich: zu int, long, short, char oder long long) konvertierbar sein darf (was eigentlich schon impliziert, dass es sich um einen Pointer handeln soll, ich sehe keinen Grund es anders zu machen).
Lange Rede kurzer Sinn: Versuch ja nicht, etwas mit dieser Adresse zu machen  | Bitte nur als Standard zitieren, was auch Standard ist.
| n3290 schrieb: | 27.5.5.4 basic_ios flags functions [iostate.flags]
explicit operator bool() const;
1 Returns: !fail(). | |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
|
Sone Mitglied
17:38:22 19.06.2012 Titel: |
|
Zitieren |
| camper schrieb: | | Hacker schrieb: | | Klaus82 schrieb: |
Also ich nehme an, dass ich mir damit die Adresse zeigen lasse, wo der 'Stream liegt' und ich eigentlich den Inhalt sehen möchte? |
Hier der Standard:
| C++-Standard 27.4.4.3 Klausel 1 schrieb: | Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success then a value that will
evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type
returned shall not be convertible to int. |
Es ist also (seit C++11?) nicht definiert, welchen Rückgabetyp der überladene Operator hat. Lediglich, dass der Rückgabetyp zu bool konvertierbar sein muss. Außerdem ist festgehalten, dass der Typ nicht zu einem Integral (sprich: zu int, long, short, char oder long long) konvertierbar sein darf (was eigentlich schon impliziert, dass es sich um einen Pointer handeln soll, ich sehe keinen Grund es anders zu machen).
Lange Rede kurzer Sinn: Versuch ja nicht, etwas mit dieser Adresse zu machen  | Bitte nur als Standard zitieren, was auch Standard ist.
| n3290 schrieb: | 27.5.5.4 basic_ios flags functions [iostate.flags]
explicit operator bool() const;
1 Returns: !fail(). |
|
In welchem Standard bin ich denn?
www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
Und du? |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
|
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
|
Klaus82 Mitglied
17:43:01 19.06.2012 Titel: |
|
Zitieren |
Hi,
jetzt natürlich die Masterfrage:
Wie kriege ich die Werte meiner Strings in wissenschaftlicher Notation in einen integer umgewandelt.
Also bisher habe ich
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <stdlib.h>
int main()
{
std::string filename("f.positive.dat");
std::ifstream infile(filename.c_str());
std::string s1,s2,s3;
double energy;
long int number, integrated_number;
for(int i = 0; i < 4; ++i)
{
infile >> s1;
infile >> s2;
infile >> s3;
energy = atof(s1.data());
number = atol(s2.data());
std::cout << s1 << "\t" << s2 << std::endl;
std::cout << energy << "\t" << number << std::endl;
}
return 0;
} | |
Was mir dann die Ausgabe liefert
| Code: | 1 2 3 4 5 6 7 8 | 0.000000000000000E+000 7.460079967364139E+023
0 7
3.300000000000000E-002 9.496822501615066E+020
0.033 9
6.600000000000000E-002 7.581970551546497E+020
0.066 7
9.900000000000002E-002 6.117185676453359E+020
0.099 6 | |
Also die eine Zeile zeigt schön den Inhalt des Strings, während die andere Zahl gerade bei der Konvertierung in einen Integer leider versagt.
Also Bonus will ich das ganze sowieso noch durch 1.0e16 teilen, geht das nicht auch direkt mit dem String?
Die einfache Zeile
führt leider zu einer Fehlermeldung.
Gruß,
Klaus. |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
|
Sone Mitglied
17:44:17 19.06.2012 Titel: |
|
Zitieren |
@Klaus: Lies doch gleich eine Zahl anstatt eines Strings ein |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
|
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 171
|
Klaus82 Mitglied
17:45:59 19.06.2012 Titel: |
|
Zitieren |
Du meinst anstatt
| C++: | infile >> s1;
infile >> s2;
infile >> s3; | |
eben nur
| C++: | infile >> energy;
infile >> number;
infile >> integrated_number; | |
EDIT:
Ne, geht nicht.
Gruß,
Klaus. |
Zuletzt bearbeitet von Klaus82 am 18:00:20 19.06.2012, insgesamt 1-mal bearbeitet |
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3135
|
Sone Mitglied
18:17:24 19.06.2012 Titel: |
|
Zitieren |
| Klaus82 schrieb: |
eben nur
| C++: | infile >> energy;
infile >> number;
infile >> integrated_number; | |
EDIT:
Ne, geht nicht. |
Das kann nicht sein.
Zeig den Fehler. |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Wenn man was zum Lachen braucht: Why C++ Sucks
|
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5771
|
camper Mitglied
18:40:46 19.06.2012 Titel: |
|
Zitieren |
In gar keinem. Wie schon auf der ersten Seite steht handelt es sich nur um einen Entwurf, noch dazu um einen uralten (wie man auch an der url erkennen kann).
n3290 ist zwar auch nur ein Entwurf, bis auf die Formatierung (und Kleinigkeiten wie Vorwort etc.) aber identisch mit dem Standard.
Der letzte frei zugängliche Entwurf ist n3242, der recht nah am endültigen Standard ist (die Änderungen seit 3242 sind in 3292 aufgefüht, man kann es sich also theoretisch selbst zusammensuchen). |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|