내 문제는 파일 디스크립터에서 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 메소드는 읽은 버퍼를 볼 수 있기 때문에 fread 메소드가 length (199)보다 훨씬 많은 문자를 읽었을지라도 값을 반환하는 것으로 보입니다. 이것은 seekg 명령에 의해 결정된 길이와 일치하지 않습니다.
저는 매우 혼란스럽고 도움이 될 것입니다. 코드가 첨부되어 있습니다.
감사합니다.
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'를 지정하지 않았습니다. –