2012-01-15 52 views
0

私はいくつかのファイルioを作成していますが、以下のテストを作成しましたが、testoutput2.txtはtestinputdata.txtと同じであると思いましたか?出力データが入力データと同じでない

testinputdata.txt:

some plain 
    text 
data with 
a number 
42.0 

(その別々のライン上のいくつかのエディタではなく、1行に他の人でそのすべて)testoutput2.txt

some plain 
਍ऀ琀攀砀琀ഀഀ 
data with 
਍ 愀  渀甀洀戀攀爀ഀഀ 
42.0 

int main() 
{ 
    //Read plain text data 
    std::ifstream filein("testinputdata.txt"); 
    filein.seekg(0,std::ios::end); 
    std::streampos length = filein.tellg(); 
    filein.seekg(0,std::ios::beg); 
    std::vector<char> datain(length); 
    filein.read(&datain[0], length); 
    filein.close(); 

    //Write data 
    std::ofstream fileoutBinary("testoutput.dat"); 
    fileoutBinary.write(&datain[0], datain.size()); 
    fileoutBinary.close(); 

    //Read file 
    std::ifstream filein2("testoutput.dat"); 
    std::vector<char> datain2; 
    filein2.seekg(0,std::ios::end); 
    length = filein2.tellg(); 
    filein2.seekg(0,std::ios::beg); 
    datain2.resize(length); 
    filein2.read(&datain2[0], datain2.size()); 
    filein2.close(); 

    //Write data 
    std::ofstream fileout("testoutput2.txt"); 
    fileout.write(&datain2[0], datain2.size()); 
    fileout.close(); 
} 
+0

'std :: ios_base :: binary'で開かれたバイナリファイルでのみ' tellg'があなたに実際の文字数を与えることが期待できます。 (実際には、標準でも* *が保証されているかどうかはわかりませんが、テキストファイルの場合、実際には動作しない実装が存在します)。 – celtschk

+0

これはstd :: ios :: binaryで開いたときに動作します。ありがとう – bitgregor

答えて

0

私の側では問題なく動作しています。私はVC++ 6.0でプログラムを実行し、メモ帳とMS Wordで出力をチェックしました。問題に直面しているエディタの名前を指定できますか?

+0

ファイルを開くときにstd :: ios :: binaryを使用すると動作します。私はvs2010とメモ帳を使用します。 – bitgregor

0

あなたはUnicodeテキストを読み取ることができませんstd::vector<char>に入力します。 charデータ型は、狭い文字列でのみ機能し、読み込んだテキストファイル(testinputdata.txt)はUTF-8またはUTF-16エンコーディングで保存されていると思います。

代わりにwchar_tタイプをお試しください。特に "ワイド"(またはUnicode)文字で動作するように設計されています。

+0

'wchar_t'が必要な文字を読み込んでいないので、それらの文字が出力に表示されています。 – dreamlax

0

あなたの入力が成功したことを確認してください!これはあなたを並べ替えるでしょうが、ファイルのバイト数は読み込まれる文字数に直接関係がないことにも注意してください。バイトより少ない文字があるかもしれません(UTF8を使ってエンコードするために、 (後者はUnicodeエンコーディングでは発生しませんが)逆もまた同様です。あなたが経験するのは、read()は、あなたが読むように多くの文字を読み取ることができませんでしたが、write()はあなたがそれを与えた喜びを喜んで書いているということです。

関連する問題