如何在C中退出后返回变量

时间:2013-10-28 14:41:14

标签: c arrays struct append

好的,我有一个程序,它将一个结构的新条目添加到.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
}

不确定我是否要遗漏任何东西。任何帮助都会很棒。谢谢!

3 个答案:

答案 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)

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