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

时间:2010-07-16 07:46:42

标签: c file

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

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

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

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

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

帮助我实现这个目标。

5 个答案:

答案 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;
}