2009-05-16 6 views
38

나는 C로 파일에 데이터를 쓰고있다. 내가 지금 쓰고있는 것보다 길 경우를 대비하여 파일에 쓰여진 이전 텍스트를 지우고 싶다. 파일 크기를 줄이거 나 끝날 때까지 자릅니다. 어떻게해야합니까?C에서 파일을 자르는 방법?

답변

19

이 더 헤더 <unistd.h> 없다하지만 아직이 0 바이트 크기의 파일을 자릅니다

_chsize(fileno(f), size); 
+5

64 비트 용 _chsize_s : _chsize_s (_fileno (f), size); – Gyuri

+0

FILE 구조체를 사용하면 _fileno 함수가 실제로 도움이됩니다. – Carthi

+0

MS-Windows 전용 함수가 아닙니다. –

12

이것은 운영 체제의 기능입니다. 표준 POSIX 방법은 다음과 같습니다 :

open("file", O_TRUNC | O_WRONLY); 
+6

을 사용하여 파일을자를 수 있습니다. – chmike

4

전체 파일을 자르려면 파일을 열어서 쓰면됩니다. 그렇지 않으면 파일을 열어 읽기 위해 열어두고 임시 변수에 보관하려는 파일의 부분을 읽은 다음 필요한 곳으로 출력해야합니다. 파일의

FILE *file = fopen("filename.txt", "w"); //automatically clears the entire file for you. 

자르기 부분 :

FILE *inFile("filename.txt", "r"); 
//read in the data you want to keep 
fclose(inFile); 
FILE *outFile("filename.txt", "w"); 
//output back the data you want to keep into the file, or what you want to output. 
+5

이것은 매우 비효율적 인 방법입니다. @ 조나단 Leffler의 방법이 훨씬 더 바람직합니다, 그리고 귀하의 플랫폼이 그것을 허용하지 않는 경우, 적어도 쓰기/이름 바꾸기 사이클, 충돌의 경우 dataloss을 방지하기 위해 (임시 이름 아래에 새로운 파일에 데이터를 복사 한 다음 이름을 바꿉니다 (가능하면 원자 적으로) 이전 파일을 삭제하십시오. – derobert

3

< 편집 >

아, 당신은 당신의 게시물을 편집, 당신은 C를 사용하고

전체 파일을 잘라 내기 파일을 열 때 "w +"모드로 파일을 열면 쓰기가 가능하도록 파일이 자릅니다.

FILE* f = fopen("C:\\gabehabe.txt", "w+"); 
fclose(file); 

</편집 >

C++에서 파일을 절단하려면, 당신은 단순히 을 사용하여 파일에 ofstream 객체를 생성 할 수 있습니다 ios_base :: TRUNC 파일 모드를 절단하는 등, 그래서 같은 :

ofstream x("C:\\gabehabe.txt", ios_base::trunc); 
+0

fopen은 "gabehabe.txt"파일의 내용을 잘라내서 파일 포인터를 시작 부분에 맞 춥니 다. 그러나 파일 포인터를 재배치하기 전에 파일 내용을 비 웁니까? – Arpith

58

당신이 어떤 길이로 파일을 백업의 이전 내용을 보존하려는 경우 (다른 답변이 제공하는 0보다 큰 길이), P OSIX는 작업에 대해 truncate()ftruncate() 기능을 제공합니다.

#include <unistd.h> 
int ftruncate(int fildes, off_t length); 
int truncate(const char *path, off_t length); 

이 이름은 파일의 길이를 줄이는 주된 목적을 나타냅니다. 그러나 지정된 길이가 이전 길이보다 긴 경우 파일은 새 크기로 커집니다 (제로 패딩). ftruncate()FILE *이 아닌 파일 설명자에서 작동합니다. 당신은 사용할 수 있습니다

if (ftruncate(fileno(fp), new_length) != 0) ...error handling... 

그러나 파일 스트림 (FILE *) 및 파일 기술자 단일 파일 (int) 액세스를 혼합하는 것은 혼란을 야기하는 경향이 있음을 알고 있어야합니다 - 몇 가지 문제에 대한 의견을 참조 . 이것은 최후의 수단이되어야합니다.

오픈 소스를 잘라내는 것이 모두 필요한 경우 일 수 있습니다. 그렇기 때문에 다른 사람이 제공 한 옵션으로 충분할 수 있습니다. 이 UNIX의 몇 가지 맛으로 실행하는 경우

+0

앞으로 2 분 ... 좋은! –

+0

현저하게 유사한, Lance! 적어도 우리 중 하나가 정보를 정확하게 얻었습니다. (을 사용하면 최신 POSIX 표준에서는 필요하지 않지만 안전성 때문에 아무런 해가 없습니다.) –

+1

C++에서 2003과 같은 함수가 있습니까? 찾을 수 없습니까? 포함하지 않았 으면 어쩌면 도움이 되었습니까? w를 사용하여 파일을 열지 않고 이미 열려있는 파일을 사용합니다. – sofr

5

, 이러한 API를 사용할 수 있어야 : 내 리눅스 박스에 "남자 잘라 내기"에 따르면

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

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

는, 이러한 POSIX-준수합니다. 현재 길이보다 큰 길이를 전달하면 이러한 호출은 실제로 파일 크기 (!)를 증가시킵니다.Windows 시스템에서

관련 문제