2012-04-25 60 views
0

我的問題是,使用ifstream讀取和文件描述符fread似乎並沒有產生相同的結果。ifstream讀取和fread不返回相同的數據,C++

我打開一個文件並使用ifstream open/read在ios :: binary模式下讀取其輸入。然後我將這個緩衝區寫出到一個文件中。幹活。

接下來,我打開相同的文件,使用FILE *文件描述符和fread讀取其輸入。然後我將這個緩衝區寫出到另一個文件out2。

當我將out1與out2進行比較時,它們不匹配。 out2,它使用FILE *,似乎停止閱讀,接近結束。

更令人擔憂的是,兩個緩衝區都不匹配輸入文件。 ifstream :: read方法似乎在修改行尾字符,即使我打開輸入文件爲ios :: binary。

fread方法似乎返回的值小於長度(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'。 – 2012-04-25 20:39:57

回答

4

你打電話fopen()使用mode r代替mode rb和使用mode w代替mode wb,這在Windows(默認)意味着你閱讀和文本翻譯寫作寫讀,不是二進制模式。

+0

謝謝你先生的褲子......我現在覺得啞巴。將在5分鐘內標記爲答案 – jbu 2012-04-25 20:43:45