2011-01-26 11 views
0

내가 그 대답을 알고 있다고 생각하지만, 나는 사람들의 반응에 관심을 가질 것이다.바이너리 파일 읽기

현재, 나는 다음 (간체 코드)를 사용하여 텍스트 파일을 읽고 W2K3에서 실행되는 VC6 응용 프로그램이 있습니다

string line; 
ifstream infile("test.txt",ios::in); 
while (!infile.eof()) 
{ 
    getline(infile,line); 
} 
... 

파일의 각 레코드는 파이프로 구분 된 필드가 있고 코드가 잘 작동 필드와 레코드가 고정 길이가 아니지만 CRLF 덕분입니다. 이제 문제는 텍스트 외에 부호가없는 10 진수로 채워지는 일부 데이터로 인해 파일이 바이너리가된다는 것입니다. 기본적으로 위의 코드는 이진 파일 (구분 기호 및 LF 유지)로 열면 여전히 유효합니까? 일부 더미 데이터를 사용하여 빠른 테스트를 시도했지만 동일한 동작을 보였다.

바이너리 파일을 데이터 내용에 대한 지식으로 읽음으로써 바이트를 올바르게 검색하고 LF가 가능하다는 것을 알고 있습니다. 나는 웹을 검색하고 C++ 및 기타 .NET 언어 (옵션)에 대한 다양한 옵션을 찾았지만 한 번에 한 줄씩 읽을 수있는 것처럼 보이지는 않습니다. 가변 크기의 데이터와 LF가 목적을 이길지라도 바이너리 파일을 사용하고 있습니다. 한 번에 하나의 char을 읽지 않기를 바 랐기 때문에 전체 파일을 한 번에 읽고 싶지 않았습니다.

위의 내용이 유효하면 데이터가 손실 될 위험이 있습니까? 그렇지 않은 경우 다른 옵션을 사용해 주시면 감사하겠습니다. 그리고 만약 내가 여기서 뭔가를 놓치고 있다면, 정교하게 자유롭게 느끼십시오.

답변

0

CRLF로 제한되는 행을 사용하는 경우 이진 데이터에 CRLF가 있으면 줄 바꿈이 잘못됩니다. 또한 이진 데이터에 값 124 (세로 파이프)가 있으면 열을 결정하는 데 문제가 있습니다.

+0

동의하지만 LF와 파이프가 "데이터"의 일부가 아니므로 필드와 행 분리 기호로 사용할 수 있습니다. – user589918

+0

필자는 오랫동안 압축 10 진수 형식으로 작업하지는 않았지만, 실제로 '0000 1101','0000 1010' 또는 '0111 1100'라는 바이트 시퀀스를 결코 쓸 수 없다고 보장 할 수 있습니까? 'getline'은 처음 두 개 중 하나 또는 둘 모두를 찾고 (당신이 무엇이라고 부르는가에 따라), 분할 알고리즘은 마지막 것을 찾게 될 것입니다. –

+0

나는'getline'을 너무 잘 모르지만 C#/VB에서는 파일을 텍스트로 읽을 때'StreamReader'를 사용하고 어떤 인코딩 (ASCII/UTF8/등) 그것은 원시 바이트를 구문 분석하는 데 사용해야합니다. 인코딩이 읽은 바이트를 지원하는 한 문자열로 작업 할 수 있습니다. 인코딩을 알고 있는지 확인하십시오. ASCII는 1 바이트/문자이지만 UT8은 1 - 6 바이트/문자 일 수 있습니다. –