2017-11-03 2 views
3

EOF가 작동하는 방식을 이해할 수 없으며 내 PC가 파일 크기를 어떻게 알 수 있습니까?리눅스에서 다른 크기의 파일이있는 동일한 파일

예를 들어 test0, test1 및 test2의 3 개 파일을 만들었습니다.

abcd 

를 공백이나 새 줄이 없으면 : - : 내가 이런 식으로 test0와 TEST1을 만들었> 새 문서 및 파일 내부에 내가 쓴

int main(void) { 

    /* */ 
    FILE* fp0 = fopen("/home/kevin/eclipse-workspaceC/FileMangment/src/test0", "w+"); 
    FILE* fp1 = fopen("/home/kevin/eclipse-workspaceC/FileMangment/src/test1", "w+"); 


    if (!fp0 || !fp1) { 
     fprintf(stderr, "file pointer points to NULL\n"); 
     return 1; 
    } 

    fprintf(fp0, "abcd"); 
    fprintf(fp1, "abcd\n"); 

    fclose(fp0); 
    fclose(fp1); 

    return 0; 
} 

가 그럼 난과 TEST2를 생성, 마우스 오른쪽 버튼을 클릭 결국. wc -c test*; file test* 출력 :
4 test0 
5 test1 
5 test2 
14 total 
test0: ASCII text, with no line terminators 
test1: ASCII text 
test2: ASCII text 

나는 그들이 동일한 것 gedit를 사용하여 파일을 보러

가 (새로운 라인 설립) 그런 다음 배쉬에 나는 명령을 실행했습니다.

나는 \n이 개행 문자이고 EOF가 아니라는 것을 알고있다. (그리고 나는이 EOF가 무엇인지 이해할 수 없다.) 그래서 내 컴퓨터가 파일을 끝낼 때를 어떻게 알 수 있을까? 디스크 블록 크기가 4K 인 경우 올바른 바이트 수 후에 디스크 블록 크기가 멈추고 이후에 오는 내용을 계속 읽지 않는 이유는 무엇입니까?

이유는 이런 방식으로 파일을 구문 분석 코드의 톤 보는가 :

while((c=fgetc(infile))!=EOF){ 
putchar(c); 
} 

그래서이 어딘가에 (EOF)라는 문자가 있음을 의미를 ??????? 그러나 나는 그것을 ascii 테이블에서 찾을 수 없다. 그리고 그 가치가 -1이라는 것을 발견했습니다 .... 매우 매우 혼란 스럽습니다. ...

내 PC는 크기를 알고 있거나 크기가 어딘가요?

your file at position xyz has the size of blahblah... 

을 따라서 WHERE이 곳은 다음과 같습니다

어딘가에 내 컴퓨터에가 있어야합니다? 또는 나는 무엇을 google해야 하는가? 내가 3Gozzilion 같은 것을봤을 때 : 내 파일 크기는 어디에 저장되어 있습니까? 그리고 아무것도 찾지 못했습니다. 나는이 정보가 어디에 저장되어 있는지 알고 싶다.

+1

파일 시스템의 파일 정보에는 파일의 실제 크기 (사용중인 바이트)가 있습니다. I/O 라이브러리 및/또는 OS는이 파일을 사용하여 파일에서 읽을 수있는 내용을 제한합니다. –

+3

'EOF'문자가 없습니다. 'fgetc'는'char'를 리턴하지 않습니다. 그것은 파일의 끝에서'int' 나'EOF'로 승격 된 문자를 반환합니다. – MFisherKDX

+0

"그래서 내 컴퓨터가 파일이 끝나는 시점을 어떻게 알 수 있습니까?" 파일 길이, 생성/수정 시간, 파일 이름 등은 다른 곳에 저장됩니다. 이 메타 데이터는 종종 폴더/디렉토리에 저장됩니다. – chux

답변

2

UNIX에서 각 파일은 파일 시스템의 inode 번호에 해당합니다. 이 inode에서 파일 크기를 비롯하여 파일에 대한 여러 정보를 찾을 수 있습니다. 당신은 여기에 대한 자세한 내용은 찾을 수 있습니다 당신이

ls -l 

출력과 같은 명령을 실행할 때 유닉스 시스템에서 Overview of the Linux file system

1

을이 파일 사용 권한을 포함이

-rw-r--r-- 1 user group  393 Nov 3 22:02 README.txt 

, 소유자 비슷한입니다 , 그룹 크기, 생성 시간, 파일 이름 등등

파일 시스템 레벨에서이 정보는 inode 즉, 파일 메타 데이터를 나타내는 구조체, 사실상 각 파일 자체는 inode 번호로 표현됩니다.

매우 높은 수준에서 모든 읽기 호출은 커서 위치를 읽기 바이트로 증가시킵니다. 어떤 시점에서 이것은 파일의 크기에 도달 할 것입니다.이 경우 읽기 호출은 요청 된 파일 수를 반환하지 않을 수도 있습니다. 예를 들어,

우리가 파일 디스크립터 fd에 의해 표현 된 파일로부터 크기 바이트 수를 읽으려고하는이 읽기 호출을 관찰하십시오.

int nbytes = read(fd, buf, size); 

그러나 nbytes는 (파일의 마지막에 이르렀을 경우) 시간의 대부분은 이후의 읽기 호출이 EOF와 함께 실패 할 수 있습니다 옆에있는 경우 < 크기가 될 수 있다는 완벽하게 가능하다. 그러나 nbytes가 크기와 같지 않을 수도있는 다른 시나리오도 있습니다.

관련 문제