2014-09-19 4 views
0

정수를 포함하는 이진 파일을 이진 형식으로 읽으려고합니다. fopen() 등이 아닌 open() 및 read() 함수를 사용해야합니다.open() 및 read()를 사용하여 C에서 이진 정수 파일 읽기

파일을 열어 읽으려고하지만 내 출력에 이진 기호가 표시됩니다.

char buffer[sizeof(int)]; 
int file1; 
int bytesRead; 
file1 = open(argv[1], O_RDONLY); 
    if(file1 == -1) 
    { 
     printf("unable to open file\n"); 
     exit(1); 
    } 
    while((bytesRead = read(file1, &buffer, sizeof(buffer)))) 
    { 
     printf("%d\n", buffer); 
    } 

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

+1

입력 및 출력의 예를 들려 줄 수 있습니까?나는'% d'을 사용할 때 정상적인 숫자 출력 이외의 것을 어떻게 얻을 수 있는지 잘 모르겠다. (틀림없이 원하는 숫자가 아니지만 항상 숫자 여야 함). –

+1

'printf'에 대한 포인터를 전달합니다. 'buffer'는'int'이어야하고, 나머지는 괜찮습니다. – mafso

+0

성능상의 이유로 더 큰 버퍼를'read' (일반적으로 4Kbytes 또는 16Kbytes)에 전달하고 * partial * reads를 관리해야합니다. –

답변

1
Error 1: read(file1, &buffer, sizeof(buffer) 

배열을 사용할 때 주소를 "읽기"호출에 전달할 필요가 없습니다. 그것을 반환하기 때문에 -1 진정한 의미
실패

Correction : 
read(file1, buffer, sizeof(buffer); 


Error 2 : 
while((bytesRead = read(file1, &buffer, sizeof(buffer)))) 
Correction : 
while((bytesRead = read(file1, &buffer, sizeof(buffer))) >= 0) 

while 루프는 읽기 호출이 실패하는 경우에도 true로 평가합니다. 읽는 것이 아무것도 없을 때 0을 반환하면 더 이상 읽을 게 없다는 것을 나타내는
에 체크를 적용 할 수 있습니다. 당신이 int을 원하는 경우에

int buffer; 

는, int를 선언 :

+1

예, OP에는 int 버퍼가 필요합니다 (엄격한 앨리어싱). 그리고 나서, &가 필요합니다. 그리고 엄밀히 말하면,'&'는 여기서 중요하지 않습니다, 그들은 동일하고 어쨌든'void * '로 변환됩니다. – mafso

+0

@mafso - 내 게시물에 잘못된 내용이있는 경우 의 수정 사항을 수신 해 드리겠습니다. 감사. –

+0

아직도 OP는 문자열이 아니라'int'를 원한다고 (그리고'buffer'는 문자열이 아니며, 0-terminator없이 0 바이트를 포함 할 수있는'char' 배열입니다. '% s'과 함께). – mafso

0

변수는 그들이 사용하는 타입으로 선언해야합니다. 이는 지나치게 단순화 된 것이지만 엄격한 별칭 위반에 대해서는 안전합니다. 이 행만 변경하면 다른 코드는 정상입니다.


원래

char buffer[sizeof(int)]; 

은 위반하지 않고 int로 읽어 불가능 있다는 단점을 가지고 엄격한 앨리어싱 는 *) (엄격한 앨리어싱 수단을, 당신은에 액세스하지 않아야합니다 잘못 입력 한 lvalue를 통해 객체, 즉 선언 된 것과 다른 객체).

printf("%d\n", buffer); 

의 동작 유형 char * 값은 int 예상되는 printf에 전달되어, 정의되지 않는다. char 배열, 라인

while((bytesRead = read(file1, &buffer, sizeof(buffer)))) 
을 것입니다 정말 무엇 이었는가

경우 (그리고 그것이 int로 선언되어야한다 그것을가 int과 같이되어 있기 때문에, bufferint 경우이 줄은 OK입니다.)

은 예외적입니다. 함수에 전달 될 때 포인터가 포인터로 붕괴되므로 주소 연산자 &을 사용할 필요가 없습니다. (buffer 유형 int의 경우, 그러나 필요합니다.)

*) 완전히 불가능하지, 당신은 할 수 유형 말장난union와 함께.