2012-04-25 28 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