2012-04-25 3 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 메소드는 읽은 버퍼를 볼 수 있기 때문에 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; 
+4

'fopen'을 사용할 때 이진 모드'rb'를 지정하지 않았습니다. –

답변

4

당신은 mode r 대신 mode rb 및 Windows (기본값) 당신이 읽고 텍스트 번역 기록을 모두 걸 의미 대신 mode wbmode w를 사용하여 쓰기 위해를 사용하여 읽기 fopen()를 호출하고 -Julian , 바이너리 모드가 아닙니다.

+0

미스터 똑똑한 바지 고마워요 ... 지금 바보 같아. 5 분 안에 답변으로 표시됩니다. – jbu

관련 문제