fstream - getline Problem
-
Warum klappt das hier nicht?
bool streamwork::write_file(const string line,STREAM stream) { if (stream == build) { m_file.open(m_file_name.c_str(), ios::out | ios::app); getline(m_file,line); return m_file; } ..... ...... ....... }m_file ist eine fstream Elementvariable.
ERROR:
Project : Console application
Compiler : GNU GCC Compiler (called directly)
Directory : H:\C++ Projekte\Finanzplaner CB\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: streamwork.cpp
streamwork.cpp: In member functionbool streamwork::write_file(std::string, STREAM)': streamwork.cpp:15: error: no matching function for call togetline(std::fstream&, const std::string&)'
Process terminated with status 1 (0 minutes, 0 seconds)
-
Der Compiler beschwert sich, weil
std::getlineals zweiten Parameter eine Referenz auf einenstd::stringerwartet, in den dann auch die aktuell eingelesene Zeile geschrieben werden kann.Da Du aber in Deinen Funktionsparametern von
write_fileeine konstante Kopie vonlineerwartest (was in der Form sowieso unnötig ist, da Du Kopien von Haus aus nicht verändern kannst, und diese deshalb nicht alsconstdeklarieren musst), schlägt auchstd::getlinefehl, dalinenatürlich beschreibbar sein muss.Da:
bool streamwork::write_file(const string line,STREAM stream)Wenn Du eine Referenz auf
lineübergibst, kann dann auch in diesen String geschrieben werden. (Falls das so vorgesehen ist von Dir). Also so:bool streamwork::write_file(string &line,STREAM stream)
-
Und warum gehts jetzt nicht:
#include "streamwork.hpp" #include <iostream> #include <fstream> #include <string> using namespace std; bool streamwork::write_file(const string &line,STREAM stream) { if (stream == build) { m_file.open(m_file_name.c_str(), ios::out | ios::app); getline(line,m_file); //vertauscht return m_file; } }Project : Console application
Compiler : GNU GCC Compiler (called directly)
Directory : H:\C++ Projekte\Finanzplaner CB\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: streamwork.cpp
streamwork.cpp: In member functionbool streamwork::write_file(std::string&, STREAM)': streamwork.cpp:15: error: no matching function for call togetline(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::fstream&)'
Process terminated with status 1 (0 minutes, 0 seconds)line ist nun eine Referenz, und m_file ist nicht konstant.
MfG
Stromberg
-
Lol, warum vertauscht Du denn auch die Parameter bei
getline?std::getlinehat folgende Definition, und nach der hat man sich auch zu richten:istream& getline( istream& is, string& s)...und wenn Du nun im ersten Parameter anstatt einen Filestream einen
stringübergibst, kann das so natürlich nicht funktionieren. So wie Du es im ersten Beispiel gehabt hast, so passt es auch. Oh Gott, schon nach 0:00... in sechs Stunden muss ich raus, also verabschiede ich mich mal.
-
Du versuchst in eine konstante Variable etwas neues einzulesen. Fällt Dir beim Lesen dieses Satzes auf, was sich da beißt?

-
LordJaxom schrieb:
Du versuchst in eine konstante Variable etwas neues einzulesen. Fällt Dir beim Lesen dieses Satzes auf, was sich da beißt?

Nicht nur das...
an dem Namen der Funktion (streamwork::write_file) würde ich tippen das er schreiben will, getline dient aber dem einlesen...
cu André
-
asc schrieb:
LordJaxom schrieb:
Du versuchst in eine konstante Variable etwas neues einzulesen. Fällt Dir beim Lesen dieses Satzes auf, was sich da beißt?

Nicht nur das...
an dem Namen der Funktion (streamwork::write_file) würde ich tippen das er schreiben will, getline dient aber dem einlesen...
cu André
ios::out | ios::app implizieren das auch...
-
Also wenn ich dass richtig verstanden habe, kann man mit geline nur aus einer Datei AUSLESEN...und nicht in eine Datei etwas REINSCHREIBEN?
Somit:
getline(Objekt wo eine Zeile rausgelesen wird, Hier wird die rausgelesene Zeile dann gespeichert)Richtig?
Weil ich hab gedacht mit getline kann man auch etwas Zeilenweise in eine Datei reinschreiben.
MfG
Stromberg
-
Stromberg schrieb:
Also wenn ich dass richtig verstanden habe, kann man mit geline nur aus einer Datei AUSLESEN...und nicht in eine Datei etwas REINSCHREIBEN?
Was impliziert den der Name "getline" anderes? ;p
Stromberg schrieb:
Weil ich hab gedacht mit getline kann man auch etwas Zeilenweise in eine Datei reinschreiben.
Nein, hier kannst du aber einfach Streamoperationen nehmen...
m_file << line << std::endl;cu André
-
Wie mach ich das denn mit getline wenn ich nur zb. die zweite Zeile eines txt-Dokuments auslesen will?
alsochar engvok[200]; char gervok[200]; ifstream InFile; InFile.open(pszDATEI); if (!InFile) { cout << "Fehler beim Oeffnen der Datei!\n"; exit(1); } InFile >> engvok >> gervok; InFile.close();Der getline-Befehl muss ja anscheinend dem InFile >>... folgen, da dieser ja die erste Zeile ausliest. Wie muss denn dann der getline-Befehl für die zweite zeile lauten?
-
Ruf doch einfach zweimal getline auf. Dann hast du auch zwei Zeilen eingelesen. Die erste Zeile kannst du dann selber auseinander nehmen.
-
Hmm , irgendwie bekomm ich das net hin. Wie sage kann ich mir denn mit getline nur Zeile 3, zum Beispiel, auslesen lassen?
Hab bisher gut erklärte Lösung gefunden.
-
Wenn du bereits eine gut erklärte Lösung gefunden hast ist es ja ok.

Du kannst nicht nur die dritte Zeile einlesen. Du musst immer bis zur dritten Zeile einlesen (also 3mal getline).
-
Upps

Dann versuch ich das mal. Ich hoffe, ich hab keine Problem dabei.
Danke für die schnelle Antwort.
-
Hmm, ich habs zwar jetzt hinbekommen, dass mir verschieden Zeilen ausgelesen werden. Nur ist das bei einem txt-Dokument mit einer hohen Zeilenanzahl, sehr mühselig, für jede Zeile eine neue Variable zu definieren und auszulesen:
#include <iostream> #include <fstream> using namespace std; char engvok[256]; char gervok[256]; const char* const pszDATEI = "vok_db.txt"; int main() { string a,b,c,... ifstream InFile; InFile.open(pszDATEI); if (!InFile) { cout << "Fehler beim Oeffnen der Datei!\n"; exit(1); } getline(InFile, a); getline(InFile, b); getline(InFile, c); ... InFile.close(); cout<<a<<"\n"<<b<<"\n"<<c<<"\n"...; system("Pause"); }Gibt es da keine einfachere und elegantere Lösung als diese?
-
Wie wäres es mit einer Schlaufe + Array/std::vector?
-
Und wie würde das denn dann aussehen? Weil ich hab ehrlich gesagt keine Ahnung, wie ich das mit dem Array machen soll...
Mit der Schleife, das ist das kleinere Problem, denke ich.
-
Ein Array von strings?
std::string vokabels[1000]; // 1000 Vokabeln std::vector<std::string> vokabels2; // Dynamisches ArrayDu kannst dann ja ganz einfach auf die strings zugreifen.
for (int i = 0; i < 1000; i++) getline (InFile,vokabels[i]);So was in der Art.
-
Super! Danke

Auch gut, dass du das kommentiert hast. Jetzt gehts glaub ich auch wieder voran mit dem Programm.
-
Mit dem vector klappt das aber irgendwie nicht ganz, Der gibt mir den Fehler aus, dass vector nicht in dem Namensraum von std liegt...
Muss ich da noch etwas oben hinschreiben? Weil eigentlich verwende ich jausing namespace stdEdit: Habs jetzt, weiß was falsch war.