2013-02-24 7 views
-1

proc/stat 파일을 읽으려고했으나 다른 파일을 읽으려고했는데 완벽하게 작동 했으므로 코드가 작동한다고 확신하지 못했습니다. 여기 있습니다 코드 :리눅스에서 파일을 읽을 수 없습니다

#include <stdio.h> 
#include <stdlib.h> // for the malloc 
int main (int argc,char *argv[]) 
{ 
char *file_name = "/proc/stat"; 
char *contents; 
FILE *file; 
int filesize = 0; 
file = fopen(file_name, "r"); 
if(file != NULL) 
{ 
    //get the file size 
    fseek(file, 0, SEEK_END); 
    filesize = ftell(file); 
    fseek(file, 0, SEEK_SET); 

    printf("the file size is: %d\n", filesize); 

    contents = (char *)malloc(filesize+1); // allocate memory 
    fread(contents, filesize,1,file); 
    contents[filesize]=0; 
    fclose(file); 
    printf("File has been read: %s \n", contents); 

} 
else 
{ 
    printf("the file name %s doesn't exits", file_name); 
} 






return 0; 

}

+0

하는 (FILE_NAME '파일 이름 % s이 (가) 없습니다 종료를 않습니다 ")'의 printf를 교체, perror는'와'(file_name); ' –

+3

사용중인 모든 I/O 함수의 반환 값을 확인하지 않고 그에 따라 반응하는 경우 코드가 실패한 이유를 알 수 없습니다. 항상 호의를 베풀고 ** 항상 ** 모든 것을 확인하십시오. – Mat

+0

malloc을 캐스팅하지 마십시오. 이 코드에서 malloc의 캐스트를 제거 할 때 오류가 발생하는 것은 C++ 컴파일러를 사용하고 있기 때문입니다. C++을 사용하려면 C++'new'를 사용하십시오. 그렇지 않으면 C 컴파일러를 사용하십시오. 두 언어의 공통 하위 집합으로 제한하는 것은 실행 불가능합니다. C++이 오늘날의 공통 C 라이브러리에 사용 된 지난 10 년 동안 채택하지 않은 C의 기능이 있습니다. C++ 컴파일러로는 이들을 빌드 할 수 없습니다. 이 코드를 읽기 쉽고 C++ 호환 코드로 변환하여 C++에서 컴파일하는 데 시간을 낭비 할 것입니까? C 컴파일러 만 사용하십시오. – Sebivor

답변

2

당신은/proc 디렉토리에있는 특수 파일의 크기를 판별 할 수 있으며, 그들에 끝까지 추구 할 수 없다. 그들의 내용은 즉석에서 생성됩니다. 이 파일을 사용하면 EOF가 발생할 때까지 계속 읽어야합니다. 얼마나 많은 데이터를 미리 얻을 수 있는지 알 수 없습니다.

짧은 읽기를 얻을 때까지 512 바이트 블록의 데이터를 계속 읽으십시오. 그러면 더 이상 데이터를 읽을 수 없다는 것을 알게됩니다.

편집 : 이미 과거의 질문에이 응답 한 그냥 나에게 발생 : /proc/[pid]/cmdline file size

관련 문제