file.good() Verwendung



  • Ich weiß nicht genau was du mit Alternative meinst.
    - Willst du nur das erste Wort jeder Zeile haben?
    - Willst du nur das x. Wort jeder Zeile haben?
    - Willst du nur jedes zweite Wort haben?
    - Willst du nur jedes x. Wort haben?

    etc.pp.



  • Danke fuer deine Hilfe.

    Die Zeile in der Datei sieht z.B. so aus:

    1: Hallo Welt. Dies ist ein Test"
    2: Fuchs du hast die ganz gestohlen.
    3: Na gut. Was soll's.
    

    Und ich moechte daraus lesen:

    Hallo Welt. Dies 
    Fuchs du hast
    Na gut. Was
    

    Also immer die ersten 3 Woerter beispielsweise.



  • ups. Natuerlich heisst es die "Gans"!



  • Ich bin mir sicher es geht noch generischer aber mit Hilfe von algorithm und Funktoren geht es recht simpel:

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    struct ThirdSpace{
        ThirdSpace() : n(0){ }
        int n;
        bool operator()(char &c){ if (c == ' ') n++; return n == 3; }
    };
    
    int main(){
        ifstream str("third.txt");
        string line;
        while(str.good()){
    	getline(str, line);
    	string part(line.begin(), find_if(line.begin(), line.end(), 
    					  ThirdSpace()));
    	cout << part << endl;
        }
    
    }
    

    [bitte kein Beispiel an der miserablen Variablenbenennung etc. nehmen 😉 ]



  • Hm, danke fuer die Hilfe.

    Prinzipiell brauche ich es doch etwas anders:
    Wenn die Datei so aussieht:

    hallo 123,4 556,3 abc
    oslo 423,4 656,5 cba
    ...
    

    und ich

    hallo in Variable meinText
    123,4 in Variable Wert1
    556,3 in Variable Wert2
    

    "transportieren" moechte? Gibt es da was einfaches, ich hatte ueberlegt es mit strtok zu machen, aber weiss nicht, ob das so klappt



  • So liest du es direkt aus der Datei:

    string meinText;
      double Wert1;
      double Wert2;
    
      fstr >> meinText >> Wert1 >> Wert2;
    

    Und wenn du die Zeile schon als String hast:

    stringstream sstr(dieZeileAlsString);
      sstr >> meinText >> Wert1 >> Wert2;
    

    Aber ob 123,456 jetzt als double interpretiert wird, hängt, glaube ich, von der Locale ab. Da kann dir hier aber sicher jemand anders (oder Google) helfen. Nicht mein Gebiet. 😉



  • So, jetzt doch nochmal ein Problem und zwar liest er bei folgenden simplen Programm bis in die Unendlichkeit - woran kann das nur liegen?
    Er findet bzw. returned scheinbar kein EOF.

    ifstream 	file("test");
    string 		buffer;
    int 		i=0;
    
    if (file.is_open()) {
      while (!file.eof()) 
      {
    	cout <<  "EOF: " << file.eof() << endl;
    
        	i++;
        	getline(file, buffer);  
       	try 
    	{
    	  cout << i << ": "<< buffer << endl;
        	}  catch (exception& ex) {
    		cout << "ERROR READING!" <<endl; 
    	}  
      }
      file.close();
    }
    


  • ich hatte fast vermutet, dass durch

    #include <fstream>
    #include <iostream>
    

    beide Header eventuell das falsche EOF benutzt wird, aber durch

    ifstream 	file(..);
    

    sollte das ja geregelt sein.

    Verstehe ich also nicht, wo das Problem liegt...



  • Bei mir funktioniert das von dir gepostete Programm so wie es sollte.

    EDIT: Davon abgesehen das das "try" wohl eher auch das getline beinhalten sollte, denn so fängst du nur Exceptions ab die beim Schreiben auftreten könnten.



  • Das ist gerade das kuriose, dass das Programm z.B. einwandfrei unter einem Linux System arbeitet, aber nicht unter einem bestimmten SunOS Acoount.

    Irgendwie komm ich da nicht weiter, weil ich nicht weiss, wo der Fehler herkommen koennte.
    Wie gesagt er findet einfach kein EOF.


Anmelden zum Antworten