截断文件

12 c windows winapi

我正在使用fopen fseeko64 ftello64 fclose等来操作文件.

如何截断文件?我知道在C中没有标准的方法可以做到这一点.我想要的是一些适用于任何win32平台的方法.我正在使用mingw gcc进行编译.

请注意:我的意思是将文件的大小截断为指定的大小,而不是将其缩小为0.使用像复制部分到另一个文件和删除/重命名的技巧是不合适的.

Ada*_*vis 17

SetEndOfFile()

获取具有写访问权限的文件句柄,设置文件指针,然后调用SetEndOfFile().

-亚当


pax*_*blo 5

如果要将文件截断为零大小,可以fopen使用以下"w"标志:

FILE *fh = fopen("file.txt","w");
if (fh != NULL) fclose(fh);
Run Code Online (Sandbox Code Playgroud)

要在标准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
Run Code Online (Sandbox Code Playgroud)

当然,如果您可以访问Win32标头和库(我相信MinGW会为您提供此功能),您可以使用SetEndOfFile()它,因为它可以使用它,而不必创建新文件然后重命名它.

这意味着使用基于Windows句柄的文件I/O而不是FILE*基于C 的文件I/O,但是,如果您无论如何都要限制自己,那可能并不重要.另一方面,如果您想要可移植性,则需要基于标准C的解决方案,例如上面的传输/重命名解决方案.


Tho*_*mas 2

如果您只是fopen()一个带有参数的文件"w",它将被截断。

http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html