Marc Miller
Marc Miller

Reputation: 165

Convert .txt file from CRLF to LF and back

I want to write a little function that takes a file as input, and writes to an output file with the following changes:

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:

input

I get this output:

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

Answers (1)

Thomas Weller
Thomas Weller

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

Related Questions