好的,我有一个程序,它将一个结构的新条目添加到.dat文件中。我知道当附加它时会添加到列表的末尾。这很好用。我遇到的问题是我有一个跟踪变量来跟踪结构的长度。我可以带回结构中的项目但是如何带回跟踪长度的变量。你无法找到它的长度所以我必须带回一个变量。我想把.dat文件的第一行留给跟踪变量,但我不知道你是否可以只追加第一行。
贝娄当然是我用来在我的结构中添加项目的。上面是num ++,这意味着结构的长度增加了一个。
if ( pWrite != NULL ) {
fprintf(pWrite, "%s %s %s\n", info2[nume].first, info2[nume].last, info2[nume].number);
fclose(pWrite);
} else {
perror("The following error occurred");
exit(EXIT_FAILURE); //exit program with error
}
不确定我是否要遗漏任何东西。任何帮助都会很棒。谢谢!
答案 0 :(得分:2)
在文件中存储一个整数,表示文件中的结构数量。
[integer]xxxxxxxxxxxxxxxxxxxxxx
或
xxxxxxxxxxxxxxxxxxxxxx[integer]
在这两种情况下,打开文件(→ fopen)时更新都需要r+
标志。然后,您可以简单地读取然后覆盖整数。
// This may not work - my C skills got worse over the time :)
FILE *f = fopen("test.dat", "r+");
fread(buffer, sizeof(int), 1, f);
fseek(f, 0, SEEK_START);
fwrite(buffer, sizeof(int), 1, f);
答案 1 :(得分:1)
如果结构的元素具有已知长度,那么您可以查看文件大小并计算必须有多少元素。这是完成所要求的最简单方法。
编辑在阅读其他尝试的答案和您的评论之后,这里可能会对您有所帮助 - 随机文件访问。以下说明了这一点:
FILE *fp;
int myCounter = -1;
fp = fopen("myFile.dat", "wb"); // want to write
fwrite(&myCounter, sizeof(int), 1, fp); // write size of -1 to start of file: "unknown count"
fprintf(fp, "Now I write something");
fseek(fp, 0, SEEK_SET); // point file to beginning
myCounter=1;
fwrite(&myCounter, sizeof(int), 1, fp); // write the new size: 1
fseek(fp, 0, SEEK_END); // back to the end of the file
fprintf(fp, "Here is something else");
... etc
如何将它包装成循环应该是显而易见的 - 请注意,在每次写入时更新文件计数器会很慢,因为磁盘将从一个扇区“搜索”到另一个扇区。因此,在您不再需要写入之前,请更好地编写,然后使用fseek
命令更新文件开头的计数器。你需要做第一次写作才能确保留出空间。我选择写-1
,因为这会向阅读程序表明“没有写入有效的大小”。通常很好地在代码中进行一些错误检查...
答案 2 :(得分:0)
如果你没有以某种方式/某处保存变量的值(例如,写入文件),并且无法从已保存的内容中重新计算它,那就消失了。