ifstream -zeilenumbruch und eof



  • Hey,

    ich möchte eine .csv-Datei Einlesen und Bearbeiten. Nun ließt mein Programm am einer Zeile noch einen Zeilenumbruch mit ein, diesen sehe ich im debugger nicht, aber er wird zb. mit Kopiert. Außerdem gibt es am ende einer .csv-Datei immer noch ein "Leerzeichen", welches ich auch im debugger sehen kann. Nun möchte ich wissen, warum ich dieses Leerzeichen in der .csv-Datei nicht sehe und wie ich mit dem Zeilenumbruch umgehe.

    ifstream file_read;
    	ofstream file_write;	
    	string str;
    
    	file_read.open("test.csv", ios::in);
    	file_write.open("test2.csv", ios_base::out);
    
    	while(!file_read.eof()){
    		getline(file_read, str, ';');
    		file_write << str << ';' << endl;
    	}
    

    danke



  • Probier doch mal dein endl zu entfernen! Das ist evtl der Grund:

    getline == leer
    +
    "\n"



  • Dein Dateiende ist falsch, weil Du falsch liest:
    Du prüfst zuerst den EOF-Status.
    Nun liest Du - dabei kann das Dateiende erreicht werden, trotzdem schreibst Du nochmal. Erst jetzt beim nächsten Schleifendurchlauf erkennst Du, dass das Dateiende eingetreten ist.

    Mach das so:

    while(getline(file_read, str, ';')){
    
            file_write << str << ';' << endl;
        }
    

    Das Zeilenumbruchproblem ist ein anderes. Da Du als Zeilentrenner das ';' nimmst, werden '\n' ganz normal mit eingelesen. Wenn Du das nicht willst, musst Du Dir da etwas anderes überlegen.



  • Das mit der Flag war noch nachvollziehbar. Das womit ich hadere ist der \n Befehl. Wenn ich in die Schleife einen Stop-Punkt setze, kann ich mir ansehen, welche Zeichen wann eingelesen und kopiert werden. Nun ist es so, dass \n niemals eingelesen wird.

    while(getline(file_read, str, ';')){
    
    		if(str!="\n"){
    			file_write << str << ';' << endl;
    		}	
    
    	}
    

    Dem entsprechend nutzt es auch nichts, dass ich auf den Zeilenumbruch Prüfe. Ich kann es umgehe, da ich weiß wie meine .csv-Datei aussieht, und ich mitzählen kann und dann die Routine überspringe, aber wirklich sauber ist es nicht.



  • Also der Zeilenumbruch ist wirklich nervig, ich kann nicht mal mitzählen lassen, da der Zeilenumbruch nicht als "Zeichen" mitgezählt wird.



  • Du kannst aber in den eingelesenen Strings nach dem '\n' suchen und da dann mitzählen oder die Dinger entfernen.



  • m.f-g schrieb:

    while(getline(file_read, str, ';')){
    
    		if(str!="\n"){
    			file_write << str << ';' << endl;
    		}	
    	
    	}
    

    Dem entsprechend nutzt es auch nichts, dass ich auf den Zeilenumbruch Prüfe.

    So geht das eher nicht. Deine Datei sieht ja vermutlich so aus:

    eins;zwei;drei;
    vier;fünf;sechs;
    ...

    Nun bekommst Du von Deinem getline (Sterne als Begrenzer):
    *eins* *zwei* *drei* \nvier ...
    weil nach *drei* alles bis zum nächsten ';' gelesen wird. Wenn Du also keine Leerzeichen irgendwo zwischen hast, könnte

    if(str[0] == '\n')
      file_write << str.substr(1) << ';' << endl;
    else
      file_write << str << ';' << endl;
    

    funktionieren, aber das kann man ganz sicher auch besser lösen.

    Edit:
    Ich weiß nicht, wie Du was zählst, aber selbstverständlich ist '\n' ein Zeichen, dass man in dem String finden und auch zählen kann.


Anmelden zum Antworten