Leere Zeilen unterschiedliche Länge

Tobsen84

Grünschnabel
Guten Morgen,

bisher war meine Suche nach einer Antwort erfolglos. Vielleicht kann mir hier jemand helfen.
Ich lese einige Dateien zeilenweise aus und lasse mir dazu die Länge der aktuellen Zeile anzeigen um dann später die leeren Zeilen zu umgehen und dann nur die Zeilen wieder in die Datei zu schreiben, die keine Leerzeilen sind. Leider gibt er mir bei Leerzeilen entweder eine Zeilenlänge von 3 oder 0 an. Wenn ich nun die Leerzeilen umgehen wollte, wüsste ich jetzt nicht wie ich diese vom Programm erkennen lassen sollte.

Wär schön wenn mir jemand da weiter helfen könnte. Natürlich sitze ich jetzt nicht hier nur so rum und warte auf Antworten. Vielleicht habe ich Glück und finde die Antwort selber.
 
Hiermit lese ich zeilenweise aus der Datei.
In "value2" steht der Pfad zur Datei die geöffnet werden soll. In "values" speicher ich die gefundenen Zeilen.

Code:
                    std::ifstream file_stream(value2);
                    if(!file_stream){std::cerr << "Fehler konnte Datei nicht oeffnen" << std::endl; std::cin.get(); return -1;}
                    
                    std::string line;
                    int i = 0;
                    
                    while(std::getline(file_stream, line, '\n'))
                    {
                        
                        if(!(line.length() <= 3 && line.length() >= 0))
                        {
                    	    values += line;
                    	    values += "\n";
                        }
                    }

Und hiermit schreibe ich nun "values" in die Datei und überschreibe alles andere
Code:
                    fstream outline;
                    outline.open(value2, ios::out|ios::ate|ios::binary);
                    outline<<values;
                    outline.close();

Zudem haben sich noch zwei weitere Probleme mit eingereiht. So wie ichs jetzt mache werden Zeilen, die keine Leerzeilen sind aber halt eine Länge von 0-3 haben mit übergangen. Dann habe ich probleme mit Dateien die entweder binär oder "normal" gelesen und geschrieben werden müssen. Also hätte ich da einen Wechsel von binär zu "normal" den ich im moment nicht unterscheiden kann.
 
Hi.

Was meinst du denn eigentlich mit Leerzeile? Ist eine Leerzeile für dich wenn wirklich nichts zwischen 2 Zeilentrennzeichen steht, oder wenn Leerzeichen wie z.B. " ", \t, \r in deiner Zeile stehen?

Und hiermit schreibe ich nun "values" in die Datei und überschreibe alles andere
Code:
                    fstream outline;
                    outline.open(value2, ios::out|ios::ate|ios::binary);
                    outline<<values;
                    outline.close();

Zudem haben sich noch zwei weitere Probleme mit eingereiht. So wie ichs jetzt mache werden Zeilen, die keine Leerzeilen sind aber halt eine Länge von 0-3 haben mit übergangen. Dann habe ich probleme mit Dateien die entweder binär oder "normal" gelesen und geschrieben werden müssen. Also hätte ich da einen Wechsel von binär zu "normal" den ich im moment nicht unterscheiden kann.
Welches Betriebssystem setzt du denn ein? Warum schreibst du nicht gleich in die Datei? Warum verwendest du bei Textdaten den "binary" Modus?

Gruß
 
Für mich ist eine Leerzeile eine Zeile ohne Inhalt. Wenn mir mein Programm jedoch beim zeilenweise auslesen eine Stringlänge von 3 bei einer Leerzeile ausgibt, muss da irgendwo doch was sein.
Ich arbeite unter Win XP. Die Dateien, die ich bearbeiten möchte, sind ganz normale .inf Dateien. Manche lassen sich wie normale Textdateien behandeln und andere kann ich nur im binären Modus anständig speichern ohne das lauter [] Vierecke drin stehen. Jedoch sind dann die ganzen Dateien, die ich als normale Textdateien behandeln kann total durcheinander.
 
Für mich ist eine Leerzeile eine Zeile ohne Inhalt. Wenn mir mein Programm jedoch beim zeilenweise auslesen eine Stringlänge von 3 bei einer Leerzeile ausgibt, muss da irgendwo doch was sein.
Genau. Du könntest dir ja mal ausgeben lassen um welche Zeichen es sich handelt. (also den Zeichencode der Zeichen meine ich)
Ich arbeite unter Win XP.
Dann verwendest du allerdings das falsche Zeichen um das Zeilenende zu markieren. Unter Windows muss man CRLF verwenden.
Die Dateien, die ich bearbeiten möchte, sind ganz normale .inf Dateien. Manche lassen sich wie normale Textdateien behandeln und andere kann ich nur im binären Modus anständig speichern ohne das lauter [] Vierecke drin stehen. Jedoch sind dann die ganzen Dateien, die ich als normale Textdateien behandeln kann total durcheinander.
Vermutlich handelt es sich um Unicode Dateien. Da wäre es besser, wenn du die wide-character Streams im Textmodus verwenden würdest. Also statt ifstream wifstream etc.

Gruß
 
Ja hattest recht mit dem Unicode. Mit wifstream klappt es nicht, vielleicht liegt es am compiler? Nutze Dev C++. Hätte aber auch keine Möglichkeit hier etwas anderes zu installieren. Kann ich denn auch anders unicode umwandeln?
 
Warum erstrellst du nicht einen booloschen wert, sagen wir mal Leer=true;
den setzt du for jeder Zeile weider auf true.
Und wenn ein Zeichen wie z.B. das A kommt, (also, sobalt in der Zele was steht) gibst du ihm den Wert false.
Wennn die denn bis zum Ender der Zeile noch true ist, ist es eine Leerzeile.
So einfach ist das.
 

Neue Beiträge

Zurück