当新项目添加到文件时,页脚应使用当前时间和小时进行更新。 以下是示例文件格式
ITEM1
ITEM2
06/07/2010 10:20:22 //页脚行
“item”必须在页脚行之前附加到现有文件中,并且应使用新值更新页脚。 我需要变量,“item”和“time”,它们将各自的值保存为字符串。
添加新项目(ITEM3)后,文件看起来像
ITEM1
ITEM2
ITEM3
07/07/2010 17:20:12 //更改页脚
帮助我实现这个目标。
答案 0 :(得分:3)
由于页脚线是静态长度...
寻找页脚行的开头,在其上面写一个新项目后跟换行符,然后写出新的页脚。
(请注意,如果您不能保证始终写入至少足够的总字节数来覆盖现有页脚,则此过程很危险,但看起来您在这里确实有这样的保证。)
答案 1 :(得分:3)
我的解决方案是,fopen
模式为“r +”(读写)。 fseek
从结尾向后,缓冲区长度值并填充它(将光标再次放在末尾),向后搜索缓冲区以查找最后一个换行符(如果没有,再搜索一下并重复),一次它已被找到(或者你点击文件的开头),搜索到文件中的那个位置(你的读取放在其他地方),然后写下你的新项目,然后是一个新行,然后是一个新的页脚。关闭文件并将truncate
缩小到正确的大小。
HTH。
修改:
如果页脚总是相同的大小,我肯定会选择Nicholas解决方案。
答案 2 :(得分:1)
类似的说明;无论何时修改文件,文件元数据都会更改以更新上次写入文件的确切时间。您始终可以在Windows上使用GetFileTime()查询该数据。
答案 3 :(得分: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);
答案 4 :(得分:0)
很容易。你只需截断最后一行。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#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;
}