我使用fopen fseeko64 ftello64 fclose等来操作文件。
我怎样才能截断一个文件? 我知道在C中没有标准的方法来实现这一点。我想要的只是某种方式可以在任何win32平台上运行。 我正在使用mingw gcc进行编译。
请注意:我的意思是截断文件的大小到一个指定的大小,而不是0大小。 而使用复制部分到另一个文件和删除/重命名的技巧是不合适的。
SetEndOfFile()
通过写访问获取文件的句柄,设置文件指针,然后调用SetEndOfFile()。
-亚当
如果要将文件截断为零,可以用"w"
标志fopen
:
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*
的,但是,如果您将自己限制为Windows,那可能就不重要了。 另一方面,如果您需要可移植性,则需要基于标准C的解决方案,例如上面的传输/重命名解决方案。
对于基于文件的文件操作,使用_fileno()和_chsize_s()更改文件的大小。
int changesize(FILE *fp, __int64 size) { int filedes = _fileno(fp); return _chsize_s(filedes, size); }
可以通过验证提供的大小小于当前文件大小来编写截断版本,因为_chsize_s()将截断或扩展文件的大小 – 请参阅http://msdn.microsoft.com/zh-cn/library/whx354w1 (VS.80).aspx 。
如果你简单地使用"w"
参数fopen()
一个文件,它将被截断。
http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html
如前所述,你可以使用fopen()和“w”标志,如:
FILE *f = fopen("file.txt", "w");
另外,如果你已经打开了这个文件,你可以用“w”标志再次使用函数freopen():
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说什么,MinGW确实可以让你访问Win32头文件。