fstream-Problem
-
Ach so, danke Ethon und Werner_logoff. In diesem speziellen Fall möchte ich immer die ersten sechs Zeichen nicht ausgeben. Der ausgegebene Text soll also die komplette Zeile ohne den ersten sechs Zeichen sein. (Rein aus Interesse: Wie würde man denn bestimmte Wörter, also z. B. das erste und das letze, wegfallen lassen?)
-
mache es so:
#include <iostream> #include <fstream> #include <string> int main() { using namespace std; string str; ifstream f("test.txt"); f.ignore(6); // überspringe die ersten 6 Zeichen if( getline( f, str ) ) // liest alles bis Zeilenende cout << "Gelesen: " << str << endl; return 0; }Einzelne Worte (oder Zahlen) liest Du mit dem operator>>. Der sollte auch immer die erste Wahl beim Lesen sein.
Ändere dazu die Zeile 11 nach:
if( f >> str ) // liest das folgende Wort
-
JFaron schrieb:
Ach so, danke Ethon und Werner_logoff. In diesem speziellen Fall möchte ich immer die ersten sechs Zeichen nicht ausgeben. Der ausgegebene Text soll also die komplette Zeile ohne den ersten sechs Zeichen sein. (Rein aus Interesse: Wie würde man denn bestimmte Wörter, also z. B. das erste und das letze, wegfallen lassen?)
In beiden Fällen gleich: ignore, dann Rest der Zeile lesen (z.B. mit getline). Im Falle, dass man genau 6 Zeichen überspringen will, gibt man eben diese Zahl bei ignore an, im Falle, dass man das erste Wort überspringen will, gibt man bei ignore ein Leerzeichen als Trennzeichen an.
edit: Zu spät. Ja, operator>> ist auch gut zum Wörter überspringen, dann gehen auch andere Whitespaces als Trennzeichen.
-
Ich danke euch beiden.
Ich teste das nun, bei Problemen melde ich mich. Noch eine Frage zum Operator: Liest der nicht nur bis zum ersten Leerzeichen aus?edit: Und wofür ist der Header <string>? Und was genau bringt das if? Die Bedingung ist das Auslesen? Heißt, wenn nichts ausgelesen werden kann, wird auch nichts ausgegeben, richtig?
edit3: Kann man mit ignore auch eine ganze Zeile überspringen?edit4: Habe einfach die Anzahl der Zeichen aus der Zeile darüber zu den 6 addiert. Funktioniert
-
JFaron schrieb:
Ich danke euch beiden.
Ich teste das nun, bei Problemen melde ich mich. Noch eine Frage zum Operator: Liest der nicht nur bis zum ersten Leerzeichen aus?Ja - operator>> string liest ein Wort, und das endet mit dem ersten nicht druckbaren Zeichen oder EOF.
JFaron schrieb:
edit: Und wofür ist der Header <string>?
für std::string, dort ist u.a. auch getline( std::istream&, std::string& ) definiert.
JFaron schrieb:
Und was genau bringt das if?
Ein std::istream ist in einen boolschen Ausdruck konvertierbar. Der liefert 'faske', wenn ein Fehler aufgetreten ist.
JFaron schrieb:
Die Bedingung ist das Auslesen? Heißt, wenn nichts ausgelesen werden kann, wird auch nichts ausgegeben, richtig?
.. wenn ein Fehler beim Lesen aufgetreten ist, wird nichts ausgegeben.
JFaron schrieb:
edit3: Kann man mit ignore auch eine ganze Zeile überspringen?
Ja - mit ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
-
Danke

Andere Frage, ähnliches Thema: Ich lese in das Programm einen Pfad per Tastatur ein. Dieser Pfad wird gespeichert in string path. Bevor ich nun weitermache, möchte ich die Existenz einer Datei in diesem Pfad testen, path/test.exe
Wenn ich das per cout<< ausgebe, bekomme ich den Pfad so angezeigt, wie ich ihn haben will. Wenn ich aberif ("ifstream check(path/test.exe)") cout<<"weitermachen "; else cout << "fehler";schreibe, wird immer weitermachen ausgegeben, auch wenn ich statt test.exe test.txt schreibe, welche dort gar nicht existiert. Was mache ich falsch bzw. wie sollte ich die Existenz einer Datei anders abfragen?
-
JFaron schrieb:
Was mache ich falsch bzw. wie sollte ich die Existenz einer Datei anders abfragen?
Derzeit hast du magisches Denken. Glaubst du, dass bei
if ("Moderiert Thomas Gottschalk noch Wetten dass?") cout << "Ja."; else cout << "Nein.";wirklich geprüft wird, was Thomas Gottschalk derzeit macht? Nein, es wird bloß die Adresse eines Zeichenkettenliterals ausgewertet und geprüft, ob diese 0 ist oder nicht.
Du kannst eine Datei auf Existenz prüfen, indem du sie zum Lesen öffnest, funktioniert dies, so existiert sie. Dazu musst du aber wirklich ein Streamobjekt anlegen, nicht bloß den Code dazu in ein Zeichenkettenliteral schreiben. Wenn du feiner aufgelöste Details wissen möchtest (z.B. vielleicht existiert die Datei, aber du darfst sie nicht lesen) musst du auf Betriebssystemfunktionen zurückgreifen.
-
Stimmt, war ein Denkfehler drin :p
Habs jetzt mitifstream check("path/test.exe"); if (check) { ... } else { ... }gelöst. Aber nun wird immer die Ausgabe bei else verwendet...
-
JFaron schrieb:
Aber nun wird immer die Ausgabe bei else verwendet...
Dann wurde die Datei wohl nicht geöffnet.
-
SeppJ schrieb:
JFaron schrieb:
Aber nun wird immer die Ausgabe bei else verwendet...
Dann wurde die Datei wohl nicht geöffnet.
Das komische ist ja, dass ich den Pfad mehrfach überprüfe, jedes mal. Auch wenn er richtig ist, komme ich bei else raus... Der Code an sich stimmt aber?!
Ich habe es sowohl mit einfachem und doppeltem Backslash und dem normalen Slash getestet. (Der normale müsste funktionieren, der doppelte auch, der einfache nicht, oder?)
-
Vorgehen:
1. Gib den Pfad absolut an - so hast Du keine Probleme mit dem Working Directory
2. Versuche ob / oder \ (bzw. \) benötigt wirdDann müsstest Du eigentlich zum Ziel kommen...
-
theta schrieb:
Vorgehen:
1. Gib den Pfad absolut an - so hast Du keine Probleme mit dem Working Directory
2. Versuche ob / oder \ (bzw. \) benötigt wirdDann müsstest Du eigentlich zum Ziel kommen...
Ich habe die entsprechenden Zeilen jetzt einfach kopiert. Im ersten Fall "path/test.exe" lande ich bei der "else-Ausgabe". Im Zweiten Fall "C:/Program Files (x86)/test/test.exe" ist die Bedingung wahr. Die Eingabe in path habe ich jetzt per Datei gemacht, so dass ich Schreibfehler auch ausschließen kann.
-
Das hier:
"path/test.exe"und das hier:
"C:/Program Files (x86)/test/test.exe"ist ja auch ein himmelweiter Unterschied!
-
Ich hatte doch bereits geschrieben, dass es sich bei "path" um einen String handelt, wenn du das mit dem Unterschied meinst.
Eine Lösung habe ich jetzt immer noch nicht...
-
Belli schrieb:
Das hier:
"path/test.exe"und das hier:
"C:/Program Files (x86)/test/test.exe"ist ja auch ein himmelweiter Unterschied!
Ich ahne etwas: Liest du (der Threadersteller) vorher einen String ein, den du
pathnennst?edit: Dein Beitrag in der Zeit als ich schrieb bestätigt diesen Verdacht. Und somit sind wieder bei Thomas Gottschalk...
Tipp: Nochmal ganz weit zurück zu den Grundlagen von C++, lernen was eine Variable ist, was eine Zeichenkette ist, wie man damit umgeht, usw.
-
JFaron schrieb:
Ich hatte doch bereits geschrieben, dass es sich bei "path" um einen String handelt, wenn du das mit dem Unterschied meinst.
Hatte ich übersehen. Dann gibt es für Dich nur einen Lösungsweg:
Lern ein paar Grundlagen!