我的問題是,使用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;
當你使用'fopen'時,你沒有指定二進制模式'rb'。 – 2012-04-25 20:39:57