C++ Carriage Return aus einem Textfile entfernen unter Windows

domidragon

Fleet Admiral
Dabei seit
Juli 2008
Beiträge
11.495
Huhu

Ich hab hier ein Problem und zwar ist es der berühmte carriage return ;)

Wir haben erst kürzlich ein Programm fertig gestellt, welches unter Linux und unter Windows laufen soll. Nun das ist nebensache, das Problem ist, dass ich das carriage return in einem File entfernen muss um ein merge vorgang besser zu optimieren. Unter Windows macht er diesen immer und somit zeigt es mir an, als ob ich jedes file komplett geändert hätte nur wegen dem CR.

Daher will ich den schon beim schreiben des Files eliminieren. Einfacher gesagt als getan. Ich hoffe es kann mir einer helfen, bin mit meinem Latein am Ende...

Ich hab folgendes mal versucht, scheint die schnellste und beste Möglichkeit zu sein, zumindest in der Theory, praktisch will das unter Windwos nicht, unter Linux funktioniert das wunderbar -.-


#include <iostream>
#include <algorithm>
#include <iterator>

int main(int argc, char *argv[])
{
std::istreambuf_iterator<char> first(std::cin), last;
std::ostreambuf_iterator<char> result(std::cout);
std::remove_copy(first, last, result, '\r');
}
Mit diesem Code kann ich unter Linux das Programm so benutzen:
removeCR < filein > fileout

und dannach sind die CRs weg.

unter Windows versuchte ich es so:
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>

int main(int argc, char *argv[])
{
std::ifstream input(argv[1]);
std::ofstream output(argv[2]);

std::istreambuf_iterator<char> first(input), last;
std::ostreambuf_iterator<char> result(output);

std::remove_copy(first, last, result, '/r');
}
und hab ihm das File(Stream) übergeben und eine Zieldatei.

Kompilieren etc. tut es, die CR sind aber immer noch vorhanden und ich weiss nicht wieso :(

Hat da Windows wieder eine eigenheit oder was mach ich falsch?

Ja es gibt über Texteditoren Möglichkeiten es zu "convertieren". Brauch es aber als Code im Programm selber, somit nützt mir das nichts ;)

Danke

greez
 
Zuletzt bearbeitet:

domidragon

Fleet Admiral
Ersteller dieses Themas
Dabei seit
Juli 2008
Beiträge
11.495
Ja Windows setzt ja CR LF an das Ende. Linux hat aber nur LF am Ende. Wesshalb das Probleme gibt beim vergleichen etc ;)

Daher suche ich nach einer Möglichkeit, das CR zu eliminieren mit C++.

greez
 

7H3 N4C3R

Lt. Commander
Dabei seit
Feb. 2002
Beiträge
1.816
Ganz einfach, weil beim Lesen das CodeConversionFacet des Streams aus \r\n (external representation) unter Windows ein \n (internal representation) macht. Kannst du ihm mit dem Binary-Mode abgewöhnen (das ist auch so ziemlich das einzige, was der Binary Mode macht).

Du kannst aber auch einfach unter Linux das Tool dos2unix benutzen oder etwas mit sed oder tr machen.

Falls du SVN benutzt - setz einfach die Property svn:eol-style auf native.
 

domidragon

Fleet Admiral
Ersteller dieses Themas
Dabei seit
Juli 2008
Beiträge
11.495
Mit dem Binary Mode hats geklappt.

#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>

int main(int argc, char *argv[])
{
std::ifstream input(argv[1], std::ios_base::binary);
std::ofstream output(argv[2], std::ios_base::binary);

std::istreambuf_iterator<char> first(input), last;
std::ostreambuf_iterator<char> result(output);

std::remove_copy(first, last, result, '\r');
}
Falls du SVN benutzt - setz einfach die Property svn:eol-style auf native.
Japp benutze ich, werde ich gleich mal testen.

thx

greez
 

7H3 N4C3R

Lt. Commander
Dabei seit
Feb. 2002
Beiträge
1.816
Japp benutze ich, werde ich gleich mal testen.
Einfach unter Linux auschecken, dos2unix über alle Sourcefiles jagen, eol-style native setzen und einchecken. Danach sollte das Problem aus der Welt sein. SVN wandelt dann unter Windows entsprechend beim Einchecken alle \r\n in \n um und beim Auschecken andersrum - ganz ohne Whitespacekonflikte.
 
Top