1

好的,所以我有一个程序,它将新条目添加到 .dat 文件的结构中。我知道将其添加到列表末尾时。这工作正常。我遇到的问题是我有一个跟踪变量来跟踪结构的长度。我可以带回结构中的项目,但如何带回跟踪长度的变量。你也找不到它的长度,所以我不得不带回一个变量。我正在考虑将 .dat 文件的第一行仅用于跟踪变量,但我不知道您是否可以仅附加第一行。

Bellow 当然是我用来将项目添加到我的结构中的东西。上面是 num ++,这意味着结构的长度增加了 1。

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
}

不确定我是否遗漏了什么。任何帮助都会很棒。谢谢!

4

3 回答 3

2

在文件中存储一个整数,表示文件中结构的数量。

[integer]xxxxxxxxxxxxxxxxxxxxxx

或者

xxxxxxxxxxxxxxxxxxxxxx[integer]

在这两种情况下,更新都需要r+打开文件时的标志(→ fopen)。然后,您可以简单地读取然后覆盖整数。

// 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);
于 2013-10-28T14:55:01.757 回答
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,因为这会向阅读程序表明“没有写入有效大小”。在你的代码中放置一些像这样的错误检查通常很好......

于 2013-10-28T14:49:42.073 回答
0

如果您没有以某种方式/某处保存变量的值(例如,写入文件),并且无法从您保存的内容中重新计算它,那么它就消失了。

于 2013-10-28T14:47:10.777 回答