7035


本家サイトで英語で質問したものの、英語が苦手＆現状回答が得られず、日本語で質問いたします。  
test.txtというのが次のようになっています。

[code]

    123456
    89
    
[/code]

※1行目は改行あり(WindowsでならCR/LF, CygwinでならLF)  
2行目は改行なし

次のコードで  
g++4.8.3(Cygwin 64bit)とVC++ 2013とでifstream::read()の出力が違います

[code]

    #include <fstream>
    #include <iostream>
    #include <string>
    #include <cstring>
    
    int main()
    {
        std::ifstream ifs("test.txt");
        if (ifs.fail())
        {
            std::cerr << "failed." << std::endl;
            return -1;
        }
        int begin = static_cast<int>(ifs.tellg());
        ifs.seekg(0, ifs.end);
        int end = static_cast<int>(ifs.tellg());
        int size = end - begin;
        ifs.clear();
        ifs.seekg(0, ifs.beg);
        char *str = new char[size + 1];
        ifs.read(str, size);
        std::cout << "[" << str << "]" << std::endl;
        std::cout << "size: " << size << "    strlen: " << std::strlen(str) << std::endl;
        delete[] str;
        return 0;
    } 
    
[/code]

g++ 4.8.3(Cygwin 64bit)では次のようにでます。

[code]

    [123456
    89
    ]
    size: 10    strlen: 10
    
[/code]

VC++ 2013では次のようにでます。

[code]

    [123456
    89]
    size: 10    strlen: 9
    
[/code]

どうして結果が違うのでしょうか？ifstream::read()の使い方がまずいのでしょうか？  
本家サイトで質問しましたところ、読んでるファイルが違うんじゃ？といわれましたが、  
確かに違いますが、問題はそこではないのです。  
g++のほうはなぜか最後にLFが付加されてしまっているようです。

解決いたしました。ViがLFを追加していました……。ご回答ありがとうございました。


CC BY-SA 3.0
2015-02-23T15:14:29.643
6978
2015-02-24T13:17:05.117
2015-02-23T17:01:20.457
7744
7744
question
windows c++
g++4.8.3(Cygwin 64bit)とVC++ 2013とでifstream::read()の出力が違います


参考:  
[Why should files end with a
newline?](https://stackoverflow.com/questions/729692/why-should-files-end-
with-a-newline)  
[EOL-EOF 問題](http://ar.aichi-u.ac.jp/blog/eol-eof.html)

UNIXのツールはテキストファイルの末尾が改行で終わることを想定しているため、テキストエディタ上では改行されていなくても、保存するときに自動的に改行が追加されていることがあります。

つまり、テキストファイルの中身はそれぞれ次のようになっているはずです。

Cygwin

[code]

    123456\n89\n
    
[/code]

VC++

[code]

    123456\r\n89
    
[/code]

どちらもファイルサイズは10バイトです。

ＶＣ＋＋のfstreamのテキストモードでは、自動的に`\r\n`を`\n`に変換します。  
そのため、`char*`に読み込んだ時には以下のようなデータになりＶＣ＋＋では1バイト減ります。

Cygwin

[code]

    123456\n89\n
    
[/code]

VC++

[code]

    123456\n89
    
[/code]

また、yohjpさんが指摘されている通り`str`の最後の1バイトが初期化されていないため、`str[size]`の部分に偶然`\n`が入っていた場合も同じような挙動になります。


CC BY-SA 3.0
2015-02-24T13:04:11.783
7035
2015-02-24T13:17:05.117
2017-05-23T12:38:56.083
-1
3639
6978
answer