2013-06-09 4 views
4

C 코드를 사용하여 파일에서 마지막 n 문자를 삭제해야합니다. fist에서 나는 '\ b'를 사용하려했지만 Segmentation Fault를 반환합니다. 나는 유사한 질문 herehere에 대한 흥미로운 대답을 보았지만 가능하다면 이것을 수행하기 위해 mmap 함수를 사용하는 것을 선호한다. 임시 파일을 만들고 파일의 일부가 원래 파일에 남을 때까지 임시 파일에 문자를 쓰면 파일을 자르는 것이 더 간단 할 수 있습니다. 문제는 내가 mmap 함수를 사용하는 방법을 이해하지 못하는 것입니다.이 함수에 전달해야하는 매개 변수는 특별히 address, lengthoffset입니다. 내가 읽은 것부터 flagsMAP_SHARED, 에 protect을 사용해야합니다.C 파일에서 마지막 n 문자 삭제

함수 정의는 말한다 : 임시

int main(int argc, char * argv[]) 
{ 
    FILE * InputFile; 
    off_t position; 
     int charsToDelete; 

    if ((InputFile = fopen(argv[1],"r+")) == NULL) 
    { 
      printf("tdes: file not found: %s\n",argv[1]); 
    } 
    else 
    { 
       charsToDelete = 5; 
     fseeko(InputFile,-charsToDelete,SEEK_END); 
     position = ftello(InputFile); 
     printf("Pos: %d\n",(int)position); 
     int i; 
     //for(i = 0;i < charsToDelete;i++) 
     //{ 
     // putc(InputFile,'\b'); 
     //} 
    } 
    fclose(InputFile); 
    return 0; 
} 

답변

4

왜 사용하지 :

#include <unistd.h> 
    #include <sys/types.h> 

    int truncate(const char *path, off_t length); 
    int ftruncate(int fd, off_t length); 

예를 들어 같은 :

charsToDelete = 5; 
    fseeko(InputFile,-charsToDelete,SEEK_END); 
    position = ftello(InputFile); 
    ftruncate(fileno(InputFile), position); 
+0

나는 당신이 제안한 것처럼'ftruncate (fileno (InputFile), position);'사용했고 그것은 훌륭하게 작동했습니다. 감사! – anairinac

+0

처음 n 문자는 어떻게 삭제 하시겠습니까? – momosxp

+0

터미널 창에서'BACKSPACE'가하는 것과 같은 파일에 쓰여진 마지막 문자를 지울 수있는 유일한 방법 (특별한 용도와 더 복잡한'mmap' 방법 외) ++ 1 –

3

파일에서 n 바이트를 제외한 모든 읽기 및 임시 파일에 쓰기, 원본 파일을 닫 이름을 변경 : 여기

void * mmap (void *address, size_t length, int protect, int flags, int filedes, off_t offset) 

메인 내입니다 원본 파일로 파일.

또는 예 : truncate 또는 이와 유사한 기능을 제공합니다.


또한, 파일을 열 실패 오류가 무엇인지보기 위해 실패에 errno를 확인해야합니다, 그것을 찾을 수없는 것을 할 필요가 없습니다. 예 : strerror을 사용하여 오류 코드에서 인쇄 가능한 문자열을 가져옵니다.

+0

하는 것은있을 수

대신,이 같은 것을 사용, 단순히 파일을 잘라내는 것이 좋습니다 일종의 권한 문제. –

+0

실제 코드에서 파일 이름에 액세스 할 수 없기 때문에 ftruncate를 사용했습니다. 감사. – anairinac

2

불행히도 mmap에서는 기본 파일 객체의 크기를 변경할 수 없습니다.

truncate(filename, new_length); 
+0

나는 이것을 위해'mmap'을 사용할 수 있다고 생각했습니다. 그 함수를 사용하는 경우 좋은 생각 인 것 같습니까? 파일에서 문자를 약간 변경해야합니까? 'memmove'를 사용할 때처럼? – anairinac

+1

'mmap'은 파일 내용을 메모리에 매핑하기 때문에 (알려진 메모리 블록 크기를 가진 포인터를 사용할 수 있기 때문에) 더 많은 데이터를 쓰거나'truncate'를 사용하여 파일 크기를 변경하기 전에 매핑 *을 제거해야합니다. 파일 내용을 빠르게 조작하고 싶다면,'mmap'은 좋은 방법입니다. 그러나 파일 크기를 변경해야 할 경우 파일을 변경 한 다음'mmap '을 사용하십시오. – mvp