[SOLVED] newline problem?
-
Hallo!
Folgender code beschreibt (hoffentlich mehr oder weniger fehlerfrei) mein CR LF Problem. In file1 wird der Dateiname für eine zu öffnende Datei ausgelesen. Ist diese (file1) unter Linux erstellt gibt es keine Probleme. Stammt sie von Windows, lässt sie sich nicht öffnen... Ich denke daher dass ein '\r' im dateinamen existiert. Leider bin ich nicht fähig den namen davon zu bereinigen
Ich möchte aber dass mein programm selbst damit fertig wird, ohne dass dos2unix oder ähnliches angewandt werden muss...
int main(int argc, char* argv[]) { fstream file1(argv[1], ios::in); string line; while(!file1.eof()) { getline(file1, line); istringstream stream(line); string firstWord; stream >> firstWord; if(firstWord == "openFile") { string filename; stream >> filename; fstream file2(filename.c_str(), ios::in); if(!file2) cerr << "fehler" << endl; //Bei Windows dateien... //irgendwelche operationen.... file2.close(); break; } else if(frstWord.....) else } file1.close(); }
-
Pigeon schrieb:
Stammt sie von Windows, lässt sie sich nicht öffnen... Ich denke daher dass ein '\r' im dateinamen existiert.
Klingt nicht sehr schlüssig. Warum schaust Du nicht einfach selbst nach? Lass Dir den Dateinamen einfach mal ausgeben.
Was Dir hier dos2unix bringen sollte, weiß ich übrigens nicht, das verändert ja nichts am Dateinamen sondern lediglich am Inhalt.
-
nman schrieb:
Pigeon schrieb:
Stammt sie von Windows, lässt sie sich nicht öffnen... Ich denke daher dass ein '\r' im dateinamen existiert.
Klingt nicht sehr schlüssig. Warum schaust Du nicht einfach selbst nach? Lass Dir den Dateinamen einfach mal ausgeben.
Was Dir hier dos2unix bringen sollte, weiß ich übrigens nicht, das verändert ja nichts am Dateinamen sondern lediglich am Inhalt.
Korrekt. Der Inhalt von der ersten Datei wird verändert, von der ich den Dateinamen auslese! Ich verstehe es ja selbst nicht so ganz, denn
while(int i = filename.find('\r') > 0) { filename.erase(i,1); i++; }
löscht irgendwie den gesamten string. Und merkwürdigerweiße nur, wenn ich filename aus einer windows-datei extrahiert habe...
//Edit: filename lese ich nicht mit stream >> filename sondern
filename = stream.str(); filename.erase(0,8); //"openFile " entfernen
So bekomme ich thoretisch dateinamen mit whitespace... (Quick & dirty version mit der annahme dass nur ein whitespace nach "openFile" existiert....)
Vll spielt das eine Rolle?
-
Ich hab hier ein kleines demo-programm gebastelt, damit ihr euch selbst überzeugen könnt
Im entpackted Verzeichnis:
$ ./bug ./ lin_source.txt //Geht
$ ./bug ./ win_source.txt //Geht nicht
-
Ach so.
Naja, dann bastel Dir eben sowas in der Art:
void removeString(const string& removeMe, string& s) { for (;;) { const string::size_type pos = s.find(removeMe); if (pos == string::npos) return; s.erase(pos, pos+removeMe.length(); } }
Und dann rufst Du das für line auf, also
removeString("\r", line);
Btw, Du solltest ein wenig auf die Verwendung der korrekten size_types und const-correctness achten.
-
Ich hätte wohl meinen Versuch mit der while schleife nur etwas "optimieren" müssen
Bevor es jetzt weitergeht muss ich wohl meine unzähligen const und size_type verstöße ausbessern *G*
Vielen Dank!
-
Pigeon schrieb:
Ich hätte wohl meinen Versuch mit der while schleife nur etwas "optimieren" müssen
Ja, tut leid, Deine ursprüngliche Fragestellung war nicht ganz eindeutig für mich.