【发布时间】:2013-02-11 15:51:17
【问题描述】:
我想知道是否可以使用frwite 在文件开头写入数据。让我更准确地说,我使用fopen 打开一个文件,然后使用 write 向它写入一些数据。就在关闭文件之前,我想写一些关于文件内容的摘要。我认为放置此摘要的最佳位置是在文件的开头。所以当我稍后打开文件时,我可以先阅读摘要,然后再阅读数据。
其实我放摘要的地方并不重要,只要我打开文件时能先看就行了。
【问题讨论】:
我想知道是否可以使用frwite 在文件开头写入数据。让我更准确地说,我使用fopen 打开一个文件,然后使用 write 向它写入一些数据。就在关闭文件之前,我想写一些关于文件内容的摘要。我认为放置此摘要的最佳位置是在文件的开头。所以当我稍后打开文件时,我可以先阅读摘要,然后再阅读数据。
其实我放摘要的地方并不重要,只要我打开文件时能先看就行了。
【问题讨论】:
不能在文件前插入数据(不重写整个文件)。
可以覆盖文件中任意位置的某些字节。为了满足您的需求,原始文件必须保留一些字节(可能在开头)以供以后覆盖。
FILE *f = fopen ("thefile", "r+"); // opens for read and write, positioned at beginning
if (!f) error_message();
size_t n = fwrite ("newdata", 1, 7, f); // overwrite first 7 bytes
if (n != 7) error_message();
fclose (f);
【讨论】:
如果你问是否可以使用fwrite()、putc()、fprintf()等在非空文件开头插入信息,答案是否定的,你可以'不要那样做。
您可以覆盖数据或附加数据。
如果你想插入,你需要检查你的操作系统API,看看是否有一个特殊的功能,如果没有,你需要创建另一个文件,将摘要写入其中,然后写入内容的原始文件。另一种选择是手动移动数据以在文件开头释放足够的空间,以便在此处写入摘要。
如果你真的想要,你可以read a text file backwards。
【讨论】:
fseek() 设置文件位置,然后在那里执行fread() 或fwrite()。您需要将文件作为二进制文件打开,而不是作为 fseek() 的文本才能工作。另外,请注意如何确定文件大小,请参阅我的答案中的fsize() 给出的链接。