Reputation: 165
I want to write a little function that takes a file as input, and writes to an output file with the following changes:
\r\n
) as EndOfLine, it should be replaced with only LF (\n
).\n
), those should be replaced with CRLF (\r\n
)See this post for a bit more info on this.
Here's my attempt at doing this:
bool convertFile(string location) {
ifstream input;
ofstream output;
input.open(location);
if(!input.is_open()){
cout << "Invalid location!" << endl;
return false;
}
int dot = location.find_last_of('.');
if(dot != string::npos) location.replace(dot, 1, "_new.");
output.open(location);
char c;
for(;;){
input.get(c);
if(!input.good()){
if(input.eof()) return true;
else return false;
}
if(c == '\r'){
input.get(c);
if(c == '\n') output << '\n'; // \r\n -> \n
else output << '\r' << c; // leave as it was, I dont know if this is needed
} else if (c == '\n'){
output << "\r\n"; // \n -> \r\n
} else {
output << c;
}
}
However, that doesn't work as expected.
With this input:
I get this output:
I tried solving this by debugging my script, and what I found is that if(c == '\r')
never evaluates to true, so it seems like I have no \r
's in my .txt
, which Notepad++ says I do.
I am on Windows, and that's the only thing I can think of that might cause this, but I don't know how.
Upvotes: 0
Views: 667
Reputation: 59440
When you open a file in text mode, the input stream will already convert line endings. Open the file in binary mode if you want full control.
input.open(location, std::ios::binary);
output.open(location, std::ios::binary);
Upvotes: 5