2012-04-25 13 views
0

私の問題は、ifstream readとfreadをファイル記述子で使用しても同じ結果が得られないようです。ifstream readとfreadが同じデータを返さない、C++

ファイルを開き、ios :: binaryモードでifstream open/readを使用してファイルを読み込みます。次に、このバッファをファイルに書き出します。 out1。

次に、同じファイルを開き、FILE *ファイル記述子とfreadを使用して入力を読み取ります。次に、このバッファを別のファイルout2に書き出します。

out1とout2を比較すると、一致しません。 FILE *を使用するout2は、終わり近くで読み込みを停止しているようです。

さらに気になる点は、どちらのバッファも入力ファイルと一致しないことです。 ifstream :: readメソッドは、入力ファイルをios :: binaryとして開いても、行末の文字を変更しているようです。

freadメソッドは、読み取られたバッファを見ることができるので、それよりもかなり多くの文字を読み込んでいますが、length(199)より小さい値を返しているようです。これは、seekgコマンドで決まる長さと一致しません。

私は非常に混乱しており、どんな助けもありがたいです。コードが添付されています。

ありがとうございます! -Julian

ifstream read_file; 
    read_file.open("V:\\temp\\compressiontest\\out\\test_20224-5120_256x256.jpg", ios::binary); 

    read_file.seekg(0, ios::end); 
    unsigned long length = read_file.tellg(); 
    cout << "Length: " << length << endl; 
    read_file.seekg(0, ios::beg); 

    unsigned char* buffer = new unsigned char[length]; 
    unsigned char* buf = new unsigned char[length]; 
    for(int i = 0; i < length; i++) 
    { 
     buffer[i] = 0; 
     buf[i] = 0; 
    } 

    if(read_file.is_open()) 
    { 
     read_file.read((char*)buffer, length); 
    } 
    else 
    { 
     cout << "not open" << endl; 
    } 

    read_file.close(); 

    FILE* read_file_1 = NULL; 
    read_file_1 = fopen("V:\\temp\\compressiontest\\out\\test_20224-5120_256x256.jpg", "r"); 
    size_t read_len = fread(buf, 1, length, read_file_1); 
    fclose(read_file_1); 

    if(read_len != length) 
     cout << "read len != length" << " read_len: " << read_len << " length: " << length << endl; 

    int consistent = 0; 
    int inconsistent = 0; 
    for(int i = 0; i < length; i++) 
    { 
     if(buf[i] != buffer[i]) 
     inconsistent++; 
     else 
     consistent++; 
    } 

    cout << "inconsistent:" << inconsistent << endl; 
    cout << "consistent:" << consistent << endl; 

    FILE* file1; 
    file1 = fopen("V:\\temp\\compressiontest\\out1.jpg", "w"); 
    fwrite((void*) buffer, 1, length, file1); 
    fclose(file1); 

    FILE* file2; 
    file2 = fopen("V:\\temp\\compressiontest\\out2.jpg", "w"); 
    fwrite((void*) buf, 1, length, file2); 
    fclose(file2); 

    return 0; 
+4

'fopen'を使うときにバイナリモード' rb'を指定していません。 –

答えて

4

あなたは、あなたが両方の読みとテキスト翻訳に書いていることを意味Windows上のどの(デフォルト)、mode w代わりのmode wbを使用してmode r代わりにmode rbを使用して、読み取りのためのfopen()を呼び出すと、書き込み用していますバイナリモードではありません。

+0

私はスマートなズボンをありがとう...私は今や馬鹿だと感じる。 5分で答えになります – jbu

関連する問題