Dateien öffnen: Code in meinem Buch funzt nicht (trotz ISO-Standart)
-
Tach erstmal
also, in meinem C++-Buch steht dass man ne Datei so öffnet:
[...]
#include <fstream>
[...]
std::ifstream file; file.open("filename.txt");
[...]
Mein Compiler (GCC 3.3 prerelease, SuSE 8.2) meckert aber
main.cpp: In function
int main()': main.cpp:16: error: no matching function for call to
std::basic_ifstream<char,
std::char_traits<char> >::basic_ifstream(std::string&)'
/usr/include/g++/iosfwd:89: error: candidates are: std::basic_ifstream<char,
std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char,
std::char_traits<char> >&)und noch ein paar Fehler in der fstream.
Was mache ich falsch ?
PS: das Buch heißt "Practical C++ Programming", Autor ist Steve Oualline, Verlag O'Reilly (Ausgabe 2)
Danke
-
STANDARD!
-
wenn ich die fehlermeldung richtig interpretiere, übergibst du einen std::string.
#include <fstream> int main () { std::ifstream in ("abc"); }
kompiliert das?
wenn du tatsächlich einen std::string verwendest, mache folgendes:#include <string> #include <fstream> int main () { std::string filename; std::ifstream in (filename.cstr()); }
denn den std::string musst du erst in einen C-String umwandeln (mit cstr)
-
davie schrieb:
wenn ich die fehlermeldung richtig interpretiere, übergibst du einen std::string.
#include <fstream> int main () { std::ifstream in ("abc"); }
kompiliert das?
wenn du tatsächlich einen std::string verwendest, mache folgendes:#include <string> #include <fstream> int main () { std::string filename; std::ifstream in (filename.cstr()); }
denn den std::string musst du erst in einen C-String umwandeln (mit cstr)
Tach erstmal
jau, danke ...
so sah der code bei mir aus:
std::string filename("my_data_file.dat"); std::ifstream data_file; data.file(filename);
so funzt es:
std::string filename("my_data_file.dat"); std::ifstream data_file; data.file(filename.c_str());
-
Tach nochmal ...
ich hab direkt ein neues Problem (wie das eben so ist wenn man ne neue Sprach erlernt):
hier mal mein gesamter code:
#include <iostream> #include <fstream> #include <string> /* * This program reads numbers from a file (my_data_file.dat) into an array * * WARNING: * The program does not work properly because I am still a C++-Newbie ;) */ int main() { std::string filename("my_data_file.dat"); const unsigned short int DATA_LENGTH(100); unsigned int data_array[DATA_LENGTH]; unsigned int *data_count(&data_array[0]); std::ifstream data_file; data_file.open(filename.c_str()); if(data_file.bad()) { std::cerr<<"Error: Something went wrong when trying to open "<<filename<<"!\n"; exit(8); } else std::cout<<"File "<<filename<<" opened!\n"; data_file.close(); return(0); }
Das Problem ist, dass if(data_file.bad()) nicht funzt. Die Datei gibt es nicht, auch ein find / -name my_data_file.dat findet keine evtl. neu erstellte Datei mit diesem Namen. Wieso ist das so ?
-
hier gibt's eine übersicht zu den iostream-funktionen
was du suchst ist die elementfunktion is_open.
btw: du solltest dem constructor das öffnen überlassen, und nicht extra open aufrufen.
ebenso brauchst du close nicht explizit aufrufen, wenn der destruktor das genausogut macht. überlass es ihm.
wenn du ne neue (leere) datei erzeugen willst, sind die default einstellungen von ifstream nicht die richtigen. nimm ofstream oder schau in einer referenz nach, was du tun musst. die (f)streams sind nämlich nicht so ganz meins
-
davie schrieb:
hier gibt's eine übersicht zu den iostream-funktionen
was du suchst ist die elementfunktion is_open.
btw: du solltest dem constructor das öffnen überlassen, und nicht extra open aufrufen.
ebenso brauchst du close nicht explizit aufrufen, wenn der destruktor das genausogut macht. überlass es ihm.
wenn du ne neue (leere) datei erzeugen willst, sind die default einstellungen von ifstream nicht die richtigen. nimm ofstream oder schau in einer referenz nach, was du tun musst. die (f)streams sind nämlich nicht so ganz meinsTach erstmal
mit
if(!data_file.good())
läuft es
Naja in meinem Buch stands so:
But what if the file numbers.dat is missing? How can you tell if there is a problem? The menmber function bad returns true if there is a problem, and flase otherwise. So to test for problems, all you need is:
if(data_file.bad()) { std::cerr<<"Unable to open numbers.dat\n"; exit(8); }
Aber das mit dem Datei fehlt stimmt wohl nicht ...
-
Tach erstmal
Typisch Newbie: Sie nerven ständig!
Jetzt auch wieder:
Ich würde gerne eine Datei zeilenweise in ein Array aus C++-Style-Strings lesen.
Da aber die Dokumentation dazu in meinem Buch sehr spärlich ist (5 Zeilen Text, 4 Zeilen Code) und auch in der C++-FAQ in diesem Forum nichts steht was mir weiterhilft, frage ich euch:
Ich hab folgende Definitioinen der getline-Funktionen:
std::istream& getline(std::istream& input_file,std::string& the_string); std::istream& getline(std::istream& input_file,std::string& the_string,char delim);
So weit, so schlecht: Wenn ich für input_file das Dateiobjekt und für the_string die String-variable einsetze, compiliert das zwar, aber der String ist immer leer.
#include <iostream> #include <fstream> #include <string> int main() { std::string filename("my_data_file.dat"); std::ifstream data_file(filename.c_str()); // convert the filename to a c-string because the constructor needs c-style-strings std::string line(""); unsigned short int count(0); if(data_file.good()) { std::istream& getline(std::istream& data_file,std::string& the_string); std::cout<<"Line=\""<<line<<"\"\n"; } else std::cout<<"Unable to open file "<<filename<<"!\n"; return(0); }
und noch was: wie kann ich so lange zeilenweise lesen bis ich am ende der datei bin (ich habs mal mit data_file.eof() probiert, hat aber nicht gefunzt) ?
bzw. wie kann ich im voraus rauskriegen wie viele Zeilen eine Datei hat? (Alles natürlich ASCII)Danke im voraus !
-
#include <iostream> #include <fstream> #include <string> int main() { std::string filename("my_data_file.dat"); std::ifstream data_file(filename.c_str()); // convert the filename to a c-string because the constructor needs c-style-strings std::string line; if(data_file.good()) { for(std::string temp; std::getline(data_file, line);) { std::getline(data_file,line); // siehe http://www.c-plusplus.net/forum/viewtopic.php?t=39469 std::cout<<"Line=\""<<line<<"\"\n"; } } else std::cout<<"Unable to open file "<<filename<<"!\n"; return(0); }
sollte jetzt funktionieren
-
sorry, hab was durcheinander gebracht. so sollte es klappen (hoff ich doch).
#include <iostream> #include <fstream> #include <string> int main() { std::string filename("my_data_file.dat"); std::ifstream data_file(filename.c_str()); // convert the filename to a c-string because the constructor needs c-style-strings std::string line; if(data_file.good()) { for(std::string temp; std::getline(data_file, temp);) // siehe http://www.c-plusplus.net/forum/viewtopic.php?t=39469 { std::getline(data_file,line); std::cout<<"Line=\""<<line<<"\"\n"; } } else std::cout<<"Unable to open file "<<filename<<"!\n"; return(0); }
-
langsam wirds peinlich
#include <iostream> #include <fstream> #include <string> int main() { std::string filename("d:\\TEST.txt"); std::ifstream data_file(filename.c_str()); // convert the filename to a c-string because the constructor needs c-style-strings std::string line; if(data_file.good()) { for(; std::getline(data_file, line);) // siehe http://www.c-plusplus.net/forum/viewtopic.php?t=39469 { std::cout<<"Line=\""<<line<<"\"\n"; } } else std::cout<<"Unable to open file "<<filename<<"!\n"; return(0); }
das funktioniert jetzt definitiv!
-
Tach erstmal
ach, so einfach ?!
std::getline(data_file, temp);
aber werden bei deinem Code nicht pro durchlauf 2 Zeilen ausgelesen ?!
Einmal im for(std::getline ...) und einmal im Körper der for-Schleife ?!
Auf jeden Fall funzt das hier:
#include <iostream> #include <fstream> #include <string> int main() { std::string filename("my_data_file.dat"); std::ifstream data_file(filename.c_str()); // convert the filename to a c-string because the constructor needs c-style-strings std::string line(""); unsigned short int count(0); // counter for the number of lines if(data_file.good()) { while(std::getline(data_file,line)) // read lines while we have not reached the end of the file { ++count; // increment the counter before writing the lines because humans start counting at 1 ;) std::cout<<"Line "<<count<<": "<<line<<"\n"; } } else std::cout<<"Unable to open file "<<filename<<"!\n"; return(0); }
Wenn ich die Anzahl der Zeilen haben will, könnte ich doch einmal die Datei durchlaufen (wie oben) und dann ein Array von der länge des Counters erstellen, oder ?
Also so:while(std::getline(data_file,line)) // read lines while we have not reached the end of the file ++count; std::string line_array[count](""); // array to store all the lines std::string *line_ptr=&line_array[0]; /* * WARNING: Hier muss ich irgendwie wieder an den Anfang der Datei ?! */ while(std::getline(data_file,line)) // read lines while we have not reached the end of the file { *line_ptr=line; ++line_ptr; }
das müsste doch funzen ?! (Ich habs noch nicht getestet)
[EDIT2]
Nein, es funzt so nicht:warning: ISO C++ forbids variable-size array
data_array' error: variable-sized object
data_array' may not be initializedAber DANKE !
[EDIT]
Sorry die Vektoren in der Ströme-FAQ haben mich etwas verwirrt so dass ich die getline-Sachen übersehen habe
[/EDIT]