2016-11-03 2 views
0

여기 파일을 열어 마지막 문자를 변경하는 해결책이 있습니다. 나는 이것이 어떻게 작동하는지 잘 모른다. 설명해 주시겠습니까?C - 파일 수정

void readlast() 
{ 
    int handle = open("./file.txt", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); 
    if (handle < 0) 
    { 
     return; 
    } 

좋아,이 부분은 파일을 열고 작동하지 않는 경우 반환합니다. 첫 번째 질문 : 파일을 여는 이유는 무엇입니까 (int handle)? 그것에 무엇이 저장되어 있습니까?

char c='N'; 
    lseek(handle, -2*sizeof(c), SEEK_END); 

lseek은 분명히 독자의 위치를 ​​변경합니다. 그래서 이것은 파일의 끝 부분에 독자를 설정합니다 (SEEK_END). 그러나 왜 우리가 문자 하나를 쓰고 싶다면 -2*sizeof(c)의 오프셋이 필요합니까?

write(handle, &c, sizeof(c)); 
    close(handle); 
} 

나는이 마지막 부분을 이해합니다.

감사합니다.

+3

_Why가 파일을 정수 (int 핸들)로 여는 이유는 무엇입니까? _ : API가 이미 정의되어 있기 때문입니다. _ 그 안에 저장되는 것은 무엇입니까? _ : 열린 파일을 식별하는 불투명 한 값입니다. 이 핸들을 사용하여 수행 할 수있는 유일한 작업은 읽기 또는 쓰기와 같은 파일 조작에이를 사용하고'close'로 파일을 닫는 것입니다. –

+2

끝에 개행 문자가있는 텍스트 파일입니까? '-1'은 마지막 문자 (EOF의 첫 번째 문자),'-2'는 개행 문자를 건너 뜁니다 ... –

+1

열린 파일에 대한 int 값은 파일 디스크립터입니다. 운영 체제는 프로세스의 열린 파일과 해당 설명자를 알고 있습니다. 커널은 각 프로세스에서 열려있는 각 파일에 대해 자체 struct를 유지합니다. lseek (3)은 SEEK_END를 사용하여 커서를 파일 + 오프셋 끝으로 이동합니다. https://linux.die.net/man/3/lseek –

답변

0
  1. 일반적으로 파일 설명자는 open()에 의해 반환되며 정수입니다. 0과 1은 일반적으로 표준 I/O입니다.

  2. 파일 크기 - 2 [옥텟]은 마지막 문자/바이트의 오프셋입니다.