2012-01-15 3 views
0

일부 파일 io를 작성하고 아래 테스트를 만들었지 만 testoutput2.txt가 실행 된 후 testinputdata.txt와 같을 것이라고 생각 했습니까?출력 데이터가 입력 데이터와 같지 않음

testinputdata.txt :

some plain 
    text 
data with 
a number 
42.0 

testoutput2.txt (일부 편집기에서의 별도의 라인에 있지만, 한 줄에 다른 사람의 모두)

some plain 
਍ऀ琀攀砀琀ഀഀ 
data with 
਍ 愀  渀甀洀戀攀爀ഀഀ 
42.0 

int main() 
{ 
    //Read plain text data 
    std::ifstream filein("testinputdata.txt"); 
    filein.seekg(0,std::ios::end); 
    std::streampos length = filein.tellg(); 
    filein.seekg(0,std::ios::beg); 
    std::vector<char> datain(length); 
    filein.read(&datain[0], length); 
    filein.close(); 

    //Write data 
    std::ofstream fileoutBinary("testoutput.dat"); 
    fileoutBinary.write(&datain[0], datain.size()); 
    fileoutBinary.close(); 

    //Read file 
    std::ifstream filein2("testoutput.dat"); 
    std::vector<char> datain2; 
    filein2.seekg(0,std::ios::end); 
    length = filein2.tellg(); 
    filein2.seekg(0,std::ios::beg); 
    datain2.resize(length); 
    filein2.read(&datain2[0], datain2.size()); 
    filein2.close(); 

    //Write data 
    std::ofstream fileout("testoutput2.txt"); 
    fileout.write(&datain2[0], datain2.size()); 
    fileout.close(); 
} 
+0

이진 파일 ('std :: ios_base :: binary'로 열림)에서만'tellg'가 실제 문자 수를 기대할 수 있습니다. (실제로 표준이 심지어 * *를 보장하는지 확신 할 수 없지만 요점은 텍스트 파일의 경우 실제로 구현되지 않는 구현이 있다는 것입니다.) – celtschk

+0

std :: ios :: binary ..로 열면 작동합니다. 감사합니다. – bitgregor

답변

0

내 문제는 잘 작동하고 VC++ 6.0에서 프로그램을 실행하고 메모장과 MS Word에서 출력을 확인했습니다. 문제가있는 곳에서 편집기의 이름을 지정할 수 있습니까?

+0

파일을 열 때 std :: ios :: binary를 사용하면 작동합니다 .. vs2010과 메모장을 사용합니다. – bitgregor

0

당신은 유니 코드 텍스트를 읽을 수 없습니다 std::vector<char>으로 char 데이터 유형은 좁은 문자열에서만 작동하며, 내가 읽고있는 텍스트 파일 (testinputdata.txt)은 UTF-8 또는 UTF-16 인코딩으로 저장됩니다.

문자 대신 wchar_t 유형을 사용해보세요. 특히 "와이드"(또는 유니 코드) 문자로 작동하도록 설계되었습니다.

+0

그는'wchar_t'를 필요로하는 문자를 읽지 않습니다. 그 문자는 출력에 나타납니다. – dreamlax

0

당신의 입력이 성공적으로 완료되었는지 확인하십시오! 이렇게하면 파일을 정렬 할 수 있지만 파일의 바이트 수는 읽는 문자 수와 직접적인 관계가 없습니다. 바이트보다 적은 문자가있을 수 있습니다 (인코딩 할 UTF8을 사용하여 여러 바이트를 사용하는 유니 코드 문자라고 생각하십시오) 또는 반대의 경우도 있습니다 (단, 후자는 유니 코드 인코딩과 함께 사용되지 않습니다). 당신이 경험하는 모든 것은 read()은 당신이 읽으라고 요청한 것만큼 많은 문자를 읽을 수 없지만 write()은 당신이 그것을 준 쓰레기를 기꺼이 썼다는 것입니다.

관련 문제