简体   繁体   中英

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:

  • If the input file uses CRLF ( \r\n ) as EndOfLine, it should be replaced with only LF ( \n ).
  • If it uses LF ( \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. (Also, sorry for the bad formatting, I couldn't get it to look better with the images)

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM