将项添加到c中最后一行之前的文件中

当新项目添加到文件时,页脚应使用当前时间和小时进行更新。 这是示例文件格式,

ITEM1
ITEM2
06/07/2010 10:20:22 //页脚线

“item”必须在页脚行之前附加到现有文件中,并且应使用新值更新页脚。 我需要变量,“item”和“time”将各自的值保存为字符串。

添加新项目(ITEM3)后文件看起来像,

ITEM1
ITEM2
ITEM3
07/07/2010 17:20:12 //改变了页脚

帮助我实现这个目标。

由于页脚线是静态长度…

寻找页脚行的开头,在其上写下新项后跟换行符,然后写出新的页脚。

(请注意,如果您不能保证始终写入至少足够的总字节数来覆盖现有页脚,则此过程很危险,但看起来您在这里确实有这样的保证。)

我的解决方案是,用“r +”模式(读写)。 fseek从结尾向后,缓冲长度的值和填充它(将光标再次放在末尾),向后搜索缓冲区以查找最后一个换行符(如果没有,再搜索一下并重复),一旦找到它(或者你点击文件的开头),搜索文件中的那个位置(你的读取放在其他地方),然后写下你的新项目,接着是一个新行,然后是一个新的页脚。 关闭文件并将其truncate为正确的大小。

HTH。

编辑:
如果页脚总是相同的大小,我肯定会选择Nicholas解决方案。

在类似的说明; 无论何时修改文件,文件元数据都会更改以更新上次写入文件的确切时间。 您总是可以在Windows上使用GetFileTime()查询该数据。

这很容易。 您只需要截断最后一行。

 #include  #include  #include  #define NEWLINE "new line to append\n" int main() { FILE *file; char *line = NULL; size_t previous_line_offset = 0, line_offset = 0; time_t time_signature; // open data file if((file = fopen("data.txt", "rw+")) == NULL) { puts("ERROR: Cannot open the file"); return 1; } // find last line offset while(!feof(file)) { int n; previous_line_offset = line_offset; line_offset = ftell(file); getline(&line, &n, file); // NOTE getline is a GNU extension } // append new line fseek(file, previous_line_offset, SEEK_SET); fputs(NEWLINE, file); // apend signature time(&time_signature); fprintf(file, "%s", asctime(localtime(&time_signature))); // free resources fclose(file); if(line) free(line); // voila! return 0; } 

一个简单(但不是非常有效)的算法可能如下所示:

 string content = ""; string line = ""; // Append every but the last line to content while(!eof(file)) { content += line; line = readline(file); } content += getNewItem(); content += generateFooter(); save(content);