2016-12-26 2 views
3

일부 데이터를 저장하기 위해 fwrite을 사용했고 이제는 처리를 위해 txt 파일에서 데이터를 읽으려고 fread을 사용하려고합니다. 개별적으로 값을 읽고 싶지만 어떻게 할 수 있는지 알 수 없습니다. 이것은 내가 시도 것입니다 :fread를 사용하여 파일 값을 값으로 읽으려면 어떻게해야합니까?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    FILE * pFile; 
    long lSize; 
    unsigned short * buffer; 
    size_t result; 

    pFile = fopen ("myfile.txt" , "rb"); 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = (unsigned short *) malloc (sizeof(unsigned short)*lSize); 

    // copy the file into the buffer: 
    result = fread (buffer,1,lSize,pFile); 

    printf("%uz\n", result); 

    // terminate 
    fclose (pFile); 
    free (buffer); 
    return 0; 
} 

위의 프로그램은 잘 컴파일하지만 ./a.out 그것을 실행할 때 나는 세그먼트 오류를 ​​얻을. sudo ./a.out으로 실행할 때 seg fault는 발생하지 않지만 아무것도 출력하지 않습니다. 문제를 해결하기 위해 무엇을 할 수 있습니까?

+0

여기에 어떤 에러 체크를 수행


읽기 당신은 확실히 사용할 수있는 하나의

에 의해 하나의 객체를'PFILE = fopen ("myfile.txt", "rb"); ' –

+0

@ πάνταῥεῖ 너와 뭐야? 내가 확인 했니? 파일을 열면됩니다. 오랫동안 파일 이름이 올바르면 정상적으로 작동합니다. –

+0

당신은'NULL'에 대한 반환 값을 체크하지 않았습니다! –

답변

1

문제는 내가 참조 :

lSize = ftell (pFile); 

lSize가 파일의 문자 수,하지 unsigned short의의 수를 설정 한 후 필요

보다 더 많은 메모리를 할당. 그러므로, 당신은 필요합니다

buffer = malloc(lSize); 

Do I cast the result of malloc?을 참조하십시오. C++ 컴파일러를 사용하는 경우 (태그가 암시하는 것처럼), 반환 값은 malloc이어야합니다.

잘못된 형식 지정은

printf("%s\n", result); 

result를 인쇄 할 잘못된 형식 지정자를 사용합니다. 당신은 그 라인은 당신이보고있는 세그먼트 오류의 가능성이 가장 높은 원인입니다

printf("%zu\n", result); 

사용해야합니다.

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    unsigned short number; 
    result = fread (&number, sizeof(unsigned short), 1, pFile);   
} 

당신은 또한 사용할 수 있습니다 :

size_t count = lSize/sizeof(short); 
for (size_t i = 0; i < count; ++i) 
{ 
    result = fread (buffer+i, sizeof(unsigned short), 1, pFile);   
} 
+0

그러나 파일에 쓰여지는 값은 unsigned short 유형입니다. 내가 한 말을 할 때 나는 단지'1z'의 뭉치를 화면에 출력한다. –

+0

'fread'의 반환 값은 읽은 객체의 수입니다. 한 번에 하나의 객체를 읽으면'result'의 값은'1'이됩니다. 내가 제안한 형식의 오류로 인해 '1z'이 출력으로 표시됩니다. ''% uz ''대신''% zu''가 필요했습니다. 답변에서 오류를 수정했습니다. –

관련 문제