Zeilenumbruch verschwindet bei einlesen mit fstream



  • Hallo Allerseits,

    ich hab eben ein kleines Programm geschrieben, das via Drag & Drop eine *.cvs bekommt und die ";" durch "|" ersetzen soll (Damit es wo anders importiert werden kann. )
    Hier der Code:

    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    #include <string.h>
    
    using namespace std;
    
    int main(int argc, char **argv)
    {
    	string outputfilename =  "output_for_Wiki.txt";
    
    	char *isochar = new char[outputfilename.size()+1];
    	isochar[outputfilename.size()] = 0;
    	memcpy(isochar, outputfilename.c_str(), outputfilename.size());
    
    	cout << "converting " << argv[1] << " ..." << endl;
    
    	ifstream isin;
    	isin.open(argv[1], ios::in);	
    
    	ofstream isout;
    	isout.open(isochar, ios::out);
    
    	if(isin.good())
    	{
    		while (!isin.eof())
    		{
    
    			char curchar;
    			isin >> curchar;
    
    			if (curchar == ';')
    				curchar = '|';
    
    			isout << curchar;
    
    		}
    	}
    	else
    		cout << "corrupted inputfile";
    
    	isin.close();
    	isout.close();
    
    	cout << "done" << endl;
    
    	return 0;
    }
    

    Leider berücksichtigt er nicht bei fstream die Zeilenenden, da das die neue Datei nur aus einer Zeile besteht.

    Darum bitte ich um Hilfe, wie ich dieses Problem beheben kann.

    Danke im Voraus.


  • Mod

    Warum nicht sed nehmen?

    Zum Programm: Da sind mehrere Fehler und Designschwächen drin.
    1. Einlesen: Du ignorierst whitespace. Du möchtest wohl eine unformatierte Lesefunktion benutzen, nicht den Operator>>. Je nach Art der Datei möchtest du vielleicht sogar im binary-Modus arbeiten. Kommt auf die Daten an.
    2. Logikfehler: Wie in jedem schlechten Lehrbuch machst du Prüfen, Lesen, Verarbieten, obwohl Lesen, Prüfen, Verarbeiten richtig wäre. Wo immer du das mit while(!eof)... her hast: Wegschmeißen und schnellstens vergessen. Vernünftiges Buch holen. Siehe meine Signatur.
    3. Zeilen 12-14 😮 😮 😮
    4. Sachen wie falsche und fehlende Header spreche ich gar nicht mehr im Details an. Alles voller Fehler. Womit hast du C++ gelernt?



  • #include <iostream>
    #include <iterator>
    #include <algorithm>
    int main() 
    { 
      std::transform(std::istreambuf_iterator<char>(std::cin),
                     std::istreambuf_iterator<char>(),
                     std::ostreambuf_iterator<char>(std::cout),
                     [](char c){return c==';' ? '|' : c;});
    }
    


  • SeppJ schrieb:

    Warum nicht sed nehmen?

    Weil dafür man: tr gedacht ist.



  • std::transform(std::istreambuf_iterator<char>(std::cin), 
                     std::istreambuf_iterator<char>(), 
                     std::ostreambuf_iterator<char>(std::cout), 
                     [](char c){return c==';' ? '|' : c;});
    

    ➡

    std::replace_copy(std::istreambuf_iterator<char>(std::cin), 
                      std::istreambuf_iterator<char>(), 
                      std::ostreambuf_iterator<char>(std::cout), 
                      ';', '|');
    

  • Mod

    eskalation schrieb:

    SeppJ schrieb:

    Warum nicht sed nehmen?

    Weil dafür man: tr gedacht ist.

    Ahh, cool 👍 . Da lag bei mir wohl ein Problem des goldenen Hammers vor. (Beim TE übrigens auch, aber mit C++ statt sed, was hier noch ungünstiger ist)


Anmelden zum Antworten