2009-11-23 2 views
4

나는 파싱 중이며 파일을 열고 첫 번째 unsigned short를 저장할 수 있어야하는 비트 맵 이미지가 있습니다.파일에서 서명되지 않은 short를 읽는 방법?

FILE 및 fscanf()를 사용하여이 작업을 시도했지만 fscanf()가 항상 실패하고 0 (성공적으로 읽은 항목 수)을 반환합니다.

FILE *pFile = fopen (fileName->c_str() , "r"); 

if (pFile == NULL) 
{ 
    cerr << "couldn't open file ; exiting..." << endl; 
    exit(0); 
} 

unsigned short seed; 
fscanf (pFile, "%hu", &seed); 

사람이 난 그냥 좀 포인터를 줄 수 어쩌면 걸릴 (아마도 ifstream?) 또는 수있는 다른 방법을 알고 있나요 ? 어떤 도움이라도 대단히 감사하겠습니다.

감사합니다.

답변

12

* scanf와 같은 형식화 된 기능을 사용하지 마십시오. 그들은 데이터의 문자 표현, 값을 문자 표현으로 변환하는 * printf 함수의 보완을 기대합니다.

unsigned val; 
f = fopen (filename, "rb"); 
if (fread (&val, 1, sizeof (val), f) != sizeof (val)) 
    // error 

가장 큰 경고는 파일 작성 방법입니다. 작성자의 endianness가이 컴퓨터가 실행되는 컴퓨터와 다른 경우에는 다음과 같이 명시 적 엔디안 코드를 사용해야합니다.

unsigned val; 
unsigned char buf[2]; 
f = fopen (filename, "rb"); 
if (fread (buf, 1, sizeof (buf), f) != sizeof (buf)) 
    // error 
else { 
// val = (buf [0] << 8) | buf [1]; // for big endian written file 
    val = (buf [1] << 8) | buf [0]; // for little endian written file 
} 
+2

이것은'unsigned char buf [2];'와'sizeof (val)'대신'sizeof buf'이어야합니다. – caf

+0

제발, 하느님. #ifdef를 꺼내서 해결책을 upvote 할 수 있습니다. 파일의 바이트 순서는 컴파일 타임 전 처리기 매개 변수에 의해 결정되지 않고 알려 져야합니다. –

+0

피드백에 감사드립니다 - 동의합니다. – wallyk

1
std::ifstream input("inputfile.txt"); 
unsigned short value; 
input >> value; 
+0

ASCII 형식의 숫자를 짧은 것처럼 읽지 않습니까? OP는 바이너리 파일의 2 바이트를 단문으로 읽으려고합니다. –

3

Ahh! 아니! fscanf는 텍스트입니다! %hu은 실제 바이트가 아닌 파일에서 "1234"와 같은 문자열을 찾습니다.

프리드 (fread)를 사용하십시오.

예.

FILE *fp = fopen("foo", "rb"); 
unsigned short x; 
fread(&x, sizeof x, 1, fp); 

사실, 엔디안을 조심하고 바이너리로 파일을여십시오. "rb"은 Windows에서 안전해야합니다. 반환 코드 등을 확인하십시오.

관련 문제