我正在使用fopen fseeko64 ftello64 fclose等来操作文件。
如何截断文件?我知道在C中没有标准的方法可以做到这一点。我想要的是一些适用于任何win32平台的方法。我正在使用mingw gcc进行编译。
请注意:我的意思是将文件的大小截断为指定的大小,而不是将其大小调整为0。并且使用像复制部件这样的技巧到另一个文件并删除/重命名是不合适的。
答案 0 :(得分:17)
答案 1 :(得分:5)
如果要将文件截断为零大小,可以使用fopen
标记"w"
:
FILE *fh = fopen("file.txt","w");
if (fh != NULL) fclose(fh);
要在标准C中截断到特定大小,可以使用传输/重命名解决方案执行此操作,例如:
FILE *finp = fopen ("inp.txt", "rb"); // should check for NULLs
FILE *fout = fopen ("out.txt", "wb");
size_t sz = 100000; // 100,000 bytes
char *buff = malloc (sz); // should check for NULL
sz = fread (buff, 1, sz, fin); // should check for errors
fwrite (buff, 1, sz, fout);
free (buff);
fclose (fin);
fclose (fout);
rename ("out.txt", "inp.txt); // should check for error
当然,如果您可以访问Win32标头和库(我相信MinGW会为您提供此功能),您可以使用SetEndOfFile()
,因为它可以使用它,而不必创建新文件然后重命名它。
这意味着使用基于Windows句柄的文件I / O而不是基于C FILE*
,但是,如果你无论如何都要限制自己,那可能并不重要。另一方面,如果您想要可移植性,则需要基于标准C的解决方案,例如上面的传输/重命名解决方案。
答案 2 :(得分:4)
对于基于文件的文件操作,请使用_fileno()和_chsize_s()来更改文件的大小。
int changesize(FILE *fp, __int64 size)
{
int filedes = _fileno(fp);
return _chsize_s(filedes, size);
}
可以通过验证提供的大小是否小于当前文件大小来编写截断版本,因为_chsize_s()将截断或扩展文件的大小 - 请参阅http://msdn.microsoft.com/en-us/library/whx354w1(VS.80).aspx。
答案 3 :(得分:2)
如果你只是fopen()
一个带有"w"
参数的文件,它将被截断。
http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html
答案 4 :(得分:1)
如前所述,您可以将fopen()与“w”标志一起使用,如:
FILE *f = fopen("file.txt", "w");
此外,如果您已经打开了文件,则可以使用函数freopen(),再次使用“w”标志:
FILE *f = fopen("file.txt", "r"); //initial fopen() call
...
f = freopen("file.txt", "w", f); //reopens "file.txt" and truncates it
http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html
编辑:在看到你编辑了你的OP后,我不会重新发布Pax和Adam Davis已经提出的内容。另外,我将确认Pax说的是,MinGW确实允许您访问Win32标头。