| Autor |
Nachricht |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 178
|
Klaus82 Mitglied
19:41:51 18.06.2012 Titel: |
Daten aus Datei einlesen |
Zitieren |
Hallo ihr Lieben,
ich versuche gerade Daten aus einer Datei einzulesen und lese im C++ Primer den Abschnitt über IO Library: File Input and Output.
Dabei verwirrt mich ein wenig die Beschreibung [1]:
| Zitat: |
When we want to read a file, we must define our own objects, and bind them to the desired files. Assuming that ifile is a string with the names of the files we want to reand, we might write code such as:
| Code: | | ifstream infile(ifile.c_str()); | |
to define and open a fstream object.
|
Also das ist jetzt nichts anderes als eine Initialisierung des Typs ifstream mit dem Bezeichner infile. Dass infile nun wie ein Funktion verwendet wird, liegt schätzungsweise daran, wie man string initialisieren kann, vergleiche z.B. mit
| Code: | std::string s1;
std::string s2(s1); Initialize s2 as a copy of s1 | |
Und dieses ifile muss wohl schon bekannt sein [2].
Jetzt geht es weiter
| Zitat: |
infline is a stream that we can read. Supplying a file name as an initializer to an ifstream object has the effect of opening the specific file
|
Gehört diese Beschreibung noch zum ersten Beispiel, wo davon ausgegangen wird, dass die Namen der Dateien bekannt sind und man den ifstream direkt an den Dateinamen gebunden hat? Denn die nächste Kommandozeile ist sehr verwirrend
| Zitat: |
| Code: | | ifstream infile; // unbound input file stream | |
|
Hä? Wieso sollte ich jetzt nochmal infile initialsieren als ifstream ? Und dann der Text
| Zitat: |
This definition defines infile as a stream object that will read from a file. This object is as yet to bound to a file. Before we use an fstream object, we must also bind it to a file to read or write
| Code: | | infile.open("in"); // open file named "in" in the current director | |
|
Hä?
Kriege ich jetzt gerade zwei Mal dasselbe erklärt? Also dass ich einen ifstream initialsieren muss und ihn dann an eine Datei binden muss? Einmal geht das ganze wie oben beschrieben in einer Zeile und das andere Mal, kann ich es in zwei Schritten tun?
Ich steh glaube gerade echt auf dem Schlauch oder die Reihenfolge der Erklärung ist komisch gewählt.
Gruß,
Klaus.
[1] Ich lasse die äquivalenten Formulierungen für output mal außen vor
[2] auf das c_str() gehe ich gar nicht näher ein. Habe die Erklärung zwar gelesen, aber die Feinheit noch nicht recht verstanden |
|
|
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17985
|
SeppJ Moderator
19:51:04 18.06.2012 Titel: |
|
Zitieren |
Ja, das sind zwei separate Beispiele, das erste ist die kompakte Schreibweise für das zweite.
| Zitat: | | Dass infile nun wie ein Funktion verwendet wird, liegt schätzungsweise daran, wie man string initialisieren kann, vergleiche z.B. mit | Korrekt, das ist ein Aufruf des Konstruktors.
| Zitat: | | Und dieses ifile muss wohl schon bekannt sein | Ja, das muss ein string mit diesem Namen sein.
| Zitat: | | auf das c_str() gehe ich gar nicht näher ein. Habe die Erklärung zwar gelesen, aber die Feinheit noch nicht recht verstanden | Das braucht man aus alten historischen Gründen (Sprich: C). Wenn dein Compiler C++11 kann, kannst du es auch weglassen.
| Zitat: | | Gehört diese Beschreibung noch zum ersten Beispiel, wo davon ausgegangen wird, dass die Namen der Dateien bekannt sind und man den ifstream direkt an den Dateinamen gebunden hat? | Ja.
| Zitat: | | Denn die nächste Kommandozeile ist sehr verwirrend | Dies ist das zweite Beispiel, dass man nicht unbedingt gleich eine konkrete Datei öffnen muss. Braucht man zugegebenerweise äußerst selten. Sieht man sehr oft in schlechten Lehrbüchern (als einzige Methode!), wenn die Leute "C mit Klassen" programmieren. |
_________________ Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
|
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 178
|
Klaus82 Mitglied
20:56:55 18.06.2012 Titel: |
|
Zitieren |
Hi,
danke für die ausführliche Antwort.
| SeppJ schrieb: | | Dies ist das zweite Beispiel, dass man nicht unbedingt gleich eine konkrete Datei öffnen muss. Braucht man zugegebenerweise äußerst selten. Sieht man sehr oft in schlechten Lehrbüchern (als einzige Methode!), wenn die Leute "C mit Klassen" programmieren. |
Na toll, ich kannte bisher nur dieses Beispiel. Obwohl ich sonst nur in Dateien geschrieben habe und nicht daraus gelesen habe. Das hatte ich dann derart konstruiert:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream f;
f.open("data.dat",ios::out);
for(int i = 0; i < 10; ++i)
{
f << i << endl;
}
return 0;
} | |
Ist das jetzt schlechter Programmierstil?
Gruß,
Klaus. |
|
|
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17985
|
SeppJ Moderator
21:16:42 18.06.2012 Titel: |
|
Zitieren |
|
 |
rüdiger
Moderator
Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23067
|
rüdiger Moderator
21:17:56 18.06.2012 Titel: |
|
Zitieren |
Ja, du solltest immer, wenn es geht, Initialisierung (also Konstruktor) bevorzugen. |
_________________ .
Zuletzt bearbeitet von rüdiger am 21:18:14 18.06.2012, insgesamt 1-mal bearbeitet |
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 178
|
Klaus82 Mitglied
22:07:21 18.06.2012 Titel: |
|
Zitieren |
Okay,
also ich habe mir zu Übungszwecken eine kleine Datei mit Wertepaaren erstellt:
und habe diese als data.dat abgespeichert.
Jetzt möchte ich die Datei einlesen, d.h. ich beginne mittels:
| C++: | 1 2 3 4 5 6 7 8 9 | #include <iostream>
#include <fstream>
int main()
{
std::ifstream in("data.dat");
return 0;
} | |
Jetzt muss ich nur gestehen, dass ich nicht so genau weiß, was jetzt eingelesen wird, da ich in meiner Datei Leerzeichen habe und Strings sehen das als Abbruchkriterium (kann man das so forumlieren?) wie eben das Beispiel zeigt:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream>
#include <fstream>
#include <string>
int main()
{
std::string s;
std::cin >> s;
std::cout << s << std::endl;
return 0;
} | |
Das liefert mir folgendes:
Ich gebe das Wertepaar 1 1 ein, erhalte aber nur eine (die erste) 1 zurück.
Also irgendwie finde ich das noch sehr verwirrend mit diesen Strings und Streams und das ganze umleiten...
Aber mal eine Zwischenfrage: Sehe ich das richtig, dass diese Operatoren < << >> > die gleichen sind wie bei Linux, mit denen ich in der Konsole umleiten kann? Also das Ergebnis des einen Befehls in einen anderen leiten wie z.B.
| Code: | | ls -l >> infofile.dat | |
Viele Grüße,
Klaus. |
|
|
|
 |
redrew99
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.03.2011
Beiträge: 360
|
redrew99 Mitglied
23:14:51 18.06.2012 Titel: |
|
Zitieren |
Wenn Du eine Datei einlesen willst, mußt Du ja die gesamte Datei durchlaufen, das kann man gut mit einer Schleife (while, for) machen.
Der Dateiinhalt wird in der Regel zeilenweise oder aber auch zeichenweise eingelesen.
Zeilenweises einlesen geht mit getline(), ein Beispiel dafür findest Du bei
http://www.cplusplus.com/reference/iostream/istream/getline/
Zeichenweises einlesen wiederum geht mit get(), ein Beispiel hierfür findest Du bei
http://www.cplusplus.com/reference/iostream/istream/get/ |
Zuletzt bearbeitet von redrew99 am 23:15:38 18.06.2012, insgesamt 1-mal bearbeitet |
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 178
|
Klaus82 Mitglied
15:13:03 19.06.2012 Titel: |
|
Zitieren |
Hi,
Ja, solche Beispiele hatte ich schon gesehen. Wobei ich mich momentan mehrere Sachen frage, wahrscheinlich weil ich hier ja ständig dazu angehalten werde 'richtig' C++ zu lernen.
Zum Einen dieser Aufbau eines strings:
Da müssen ja einige Informationen mitgegeben werden, nach denen sich z.B. das Einlesen eines strings richtet.
Also wenn ich habe:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <iostream>
#include <string>
int main()
{
std::string s;
std::cin >> s;
std::cout << s << std::endl;
return 0;
} | |
Dann kriege ich bei Ausführung des Programms:
Das bedeutet, dass das Einlesen nach dem Leerzeichen abbricht, also hält das Einlesen 'Ausschau danach'.
Noch cooler wird es, wenn ich aber mit getline arbeite:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream>
#include <string>
int main()
{
char word[256];
std::cin.getline(word,256);
std::cout << word << std::endl;
return 0;
} | |
Wobei mich hier gerade wundert, dass mit einem char gearbeitet wird? Also dieser Syntax getline(word,256) ist nun der Konstruktor dafür, dass der istream der Kommandozeileneingabe in word geschrieben wird?
Wobei dieses getline scheinbar Etiquetten-Schwindel ist, wenn ich das gerade richtig sehe, denn dieses Kommando liest einfach (in diesem Fall) 256 Zeichen ein, egal ob Leerzeichen oder nicht.
Ich dachte, neben Leerzeichen erkennt dieses getline auch eine 'Markierung für Zeilenumbruch' (gibt es das?). Aber es geht gar nicht um die Zeile, sondern um die Anzahl der Zeichen!
D.h. wenn ich das ganze mit z.B. 8 Zeichen mache, dann bin ich genauso angeschmiert, dann kriege ich
Aber hinter diesen ganzen Streams muss doch noch viel mehr stecken, also es muss z.B. ein Rückgabewert dahinterstecken, sonst würde folgendes Beispiel gar nicht funktionieren:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream>
#include <string>
int main()
{
std::string s;
while(std::cin >> s)
{
std::cout << s << std::endl;
}
return 0;
} | |
Also muss cin einen Rückgabewert true oder false haben, denn nur was ich als Argument in eine while-Schleife packe macht Sinn, dass mir auch Rückgabewerte liefert!
Alter ist das gerade spannend!
Gruß,
Klaus. |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3233
|
Sone Mitglied
15:22:16 19.06.2012 Titel: |
|
Zitieren |
| Klaus82 schrieb: |
Aber hinter diesen ganzen Streams muss doch noch viel mehr stecken, also es muss z.B. ein Rückgabewert dahinterstecken, sonst würde folgendes Beispiel gar nicht funktionieren: |
std::cin ist ein std::istream, das wiederum ein std::ios ist. std::ios überlädt den Negierungsoperator und gibt den (aktuellen) Rückgabewert der Memberfunktion fail() zurück (oder stellt ein Äquivalent dazu dar).
Oder wiederum, wie in deinem Beispiel, wird der operator void* aufgerufen. Dann wird entweder 0 zurückgegeben (fail() würde dann true zurückgeben) oder irgendeine andere Adresse (die nur indiziert dass fail() false zurückgeben würde).
Puh. |
_________________ 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. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
Zuletzt bearbeitet von Sone am 15:27:21 19.06.2012, insgesamt 3-mal bearbeitet |
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17985
|
SeppJ Moderator
15:30:46 19.06.2012 Titel: |
|
Zitieren |
Es gibt im Header string ein getline, welches dir eher passen dürfte:
http://www.cplusplus.com/reference/string/getline/
Das getline welches Member der istreams ist und auf char-Feldern arbeitet ist eher historisch interessant.
Ja, die Einlesefunktionen (und auch die Ausgabefunktionen) der Streams geben (fast) alle den Stream selber zurück. Nur so ist es möglich, mehrere dieser Funktionen aneinander zu reihen:
| C++: | int a,b;
std::cin >> a >> b; // std::cin >> a gibt std::cin zurück, darauf kann dann std::cin >> b arbeiten | |
Außerdem können Streams auf ihren Status geprüft werden, indem man sie in einem boolschen-Ausdruck auswertet. Dabei spielen eine Rolle:
http://www.cplusplus.com/reference/iostream/ios/operatornot/
http://www.cplusplus.com/ ....... ream/ios/operator_voidpt/
Da, wie schon gesagt, die Eingabefunktionen den Stream selber zurück liefern, kann man daher das gezeigte
benutzen, um bis zum Auftreten eines Fehlers zu lesen. Dies ist auch eine sehr übliche Art und Weise aus einem Stream zu lesen. Hier wird also erst der operator>> benutzt, dieser liefert wieder std::cin, dieses wird dann in einen void* konvertiert und dieser kann dann 0 oder etwas anderes sein, je nach Fehler oder kein Fehler. Und dies ist für die while-Schleife dann eben false oder true.
(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.) |
_________________ Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
Zuletzt bearbeitet von SeppJ am 15:31:29 19.06.2012, insgesamt 1-mal bearbeitet |
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 178
|
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: 178
|
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: 3233
|
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. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
|
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5802
|
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: 3233
|
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. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
|
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 178
|
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: 3233
|
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. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
|
|
 |
Klaus82
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2011
Beiträge: 178
|
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: 3233
|
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. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
|
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5802
|
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). |
|
|
|
 |
Kellerautomat
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2012
Beiträge: 910
|
Kellerautomat Mitglied
18:45:23 19.06.2012 Titel: |
|
Zitieren |
Komisch - auf meiner Festplatte liegt n3337.pdf. |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3233
|
Sone Mitglied
19:07:14 19.06.2012 Titel: |
|
Zitieren |
| Kellerautomat schrieb: | Komisch - auf meiner Festplatte liegt n3337.pdf.  |
Hä? Dann hast du ein altes gedownloadet und umbenannt XD
Oder weisste wo man das bekommt? Das von camper genannte PDF ist bei Wikipedia verlinkt. |
_________________ 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. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
|
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5802
|
camper Mitglied
19:09:26 19.06.2012 Titel: |
|
Zitieren |
n3337 ist keine schlechte Wahl. Laut n3338 sind darin nur redaktionelle Änderungen (seit n3291) enthalten, also gewissermaßen der Text des Standards berichtigt um einige (offsichtliche) Schreibfehler. |
Zuletzt bearbeitet von camper am 19:09:53 19.06.2012, insgesamt 2-mal bearbeitet |
|
 |
redrew99
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.03.2011
Beiträge: 360
|
redrew99 Mitglied
21:43:48 19.06.2012 Titel: |
|
Zitieren |
| Klaus82 schrieb: | Hi,
jetzt natürlich die Masterfrage:
Wie kriege ich die Werte meiner Strings in wissenschaftlicher Notation in einen integer umgewandelt.
|
Mit C++ geht das wohl am einfachsten, indem man die Bibliothek sstream verwendet.
Beispiel:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <sstream>
#include <string>
#include <iostream>
using namespace std;
int main()
{
double d;
string s = "3345.5";
stringstream sstr;
sstr << s;
sstr >> d;
cout<<d;
} | |
Das von dir verwendete atol geht auch, ist aber c, nicht c++.
Davon ab macht Hackers Frage aber Sinn, warum Du nicht gleich Integerwerte einliest. |
Zuletzt bearbeitet von redrew99 am 21:56:05 19.06.2012, insgesamt 2-mal bearbeitet |
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3233
|
Sone Mitglied
22:21:45 19.06.2012 Titel: |
|
Zitieren |
| camper schrieb: | | n3337 ist keine schlechte Wahl. Laut n3338 sind darin nur redaktionelle Änderungen (seit n3291) enthalten, also gewissermaßen der Text des Standards berichtigt um einige (offsichtliche) Schreibfehler. |
Wow, der neue ist viel besser geordnet als der alte, IMHO.
Zurück zum Thema: Es ist völlig unnötig (Coding-Aufwand bspw.) Zuerst einen String einzulesen, welchen man dann als Ganzzahl/Fließkommazahl auswertet. Das macht bereits der globale operator>> für die entsprechenden Skalare.
@redrew99: Boah, bei so 'ner Formatierung krieg ich son Hals! |
_________________ 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. | Der C++-Standard Draft: "Note: this is an early draft. It’s known to be incomplet and incorrekt [...]"
Zuletzt bearbeitet von Sone am 16:46:19 20.06.2012, insgesamt 3-mal bearbeitet |
|
 |
|
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.
|
|
|
|
|