Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将项附加到c中最后一行之前的文件中_C_File - Fatal编程技术网

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

将项附加到c中最后一行之前的文件中,c,file,C,File,当新项目添加到文件中时,页脚应随当前时间和小时更新。 这是示例文件格式 项目1 项目2 06/07/2010 10:20:22//页脚行 “项”必须附加到现有文件中,在页脚行之前,并且页脚应该用新值更新。 我必须使用变量“item”和“time”,它们将各自的值保存为字符串 添加新项目(项目3)后,该文件如下所示: 项目1 项目2 项目3 07/07/2010 17:20:12//更改页脚 请帮助我完成此操作。因为页脚行是静态长度 查找页脚行的开头,在其上写下新项目,然后换行,然后写出新的页脚

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

项目1
项目2
06/07/2010 10:20:22//页脚行

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

添加新项目(项目3)后,该文件如下所示:

项目1
项目2
项目3
07/07/2010 17:20:12//更改页脚


请帮助我完成此操作。

因为页脚行是静态长度

查找页脚行的开头,在其上写下新项目,然后换行,然后写出新的页脚


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

因为页脚行是静态长度

查找页脚行的开头,在其上写下新项目,然后换行,然后写出新的页脚


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

我的解决方案是,
fopen
模式为“r+”(读写)
fseek
backwards from end,一个缓冲区长度值并填充它(将光标再次放在末尾),向后搜索缓冲区以查找最后一个换行符(如果没有换行符,则再向后搜索并重复),一旦找到(或点击文件开头),搜索到文件中的该位置(您的read将其放置在其他位置),然后写入您的新项目,后跟新行和新页脚。关闭文件并将其截断为正确的大小

编辑:

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

我的解决方案是,
fopen
模式为“r+”(读写)。
fseek
从结尾向后看,缓冲区长度值并填充它(将光标再次放在末尾),向后搜索缓冲区以查找最后一行换行符(如果没有,请进一步向后搜索并重复),一旦找到(或者您找到了文件的开头),请搜索到文件中的该位置(您的读取将其放置在其他位置),然后写入新项目,后跟新行和新页脚。关闭文件并将其截断为正确的大小

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

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

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);
一个简单(但不是很有效)的算法可能如下所示:

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);

这很简单。你只需要截断最后一行

#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;
}
#包括
#包括
#包括
#定义新行“要追加的新行\n”
int main(){
文件*文件;
char*line=NULL;
上一条线的尺寸偏移=0,线偏移=0;
时间签名;
//打开数据文件
如果((file=fopen(“data.txt”,“rw+”)==NULL){
puts(“错误:无法打开文件”);
返回1;
}
//查找最后一行偏移量
而(!feof(文件)){
int n;
上一条线的偏移量=线的偏移量;
行偏移量=ftell(文件);
getline(&line,&n,file);//注意getline是GNU扩展名
}
//追加新行
fseek(文件、上一行偏移、搜索集);
FPUT(换行符、文件);
//阿本德签名
时间(&时间\签名);
fprintf(文件“%s”、asctime(localtime(&time\u签名));
//免费资源
fclose(文件);
如果(行)
自由线;
//瞧!
返回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;
}
#包括
#包括
#包括
#定义新行“要追加的新行\n”
int main(){
文件*文件;
char*line=NULL;
上一条线的尺寸偏移=0,线偏移=0;
时间签名;
//打开数据文件
如果((file=fopen(“data.txt”,“rw+”)==NULL){
puts(“错误:无法打开文件”);
返回1;
}
//查找最后一行偏移量
而(!feof(文件)){
int n;
上一条线的偏移量=线的偏移量;
行偏移量=ftell(文件);
getline(&line,&n,file);//注意getline是GNU扩展名
}
//追加新行
fseek(文件、上一行偏移、搜索集);
FPUT(换行符、文件);
//阿本德签名
时间(&时间\签名);
fprintf(文件“%s”、asctime(localtime(&time\u签名));
//免费资源
fclose(文件);
如果(行)
自由线;
//瞧!
返回0;
}

在类似的注释中;无论何时修改文件,文件元数据都会更改以更新上次文件写入的准确时间。您可以始终使用Windows上的查询数据。

在类似的注释中;无论何时修改文件,文件元数据都会更改以更新上次文件写入的准确时间。您可以始终使用在Windows上。

关于静态长度的调用很好(假设是,我假设不是),+1.您能给出seek部分的示例片段吗?@arun;
char footer[]=“00/00/0000 00:00:00\n”;FILE*f=fopen(“myfile”,“a+”);fseek(-(sizeof(footer)-1),seek\u CUR);fprintf(f,“我的下一项”);fwrite(footer,1,sizeof(footer)-1,f);fclose(f);
sizeof上的-1用于删除字符串文本中的隐式空终止符。我尝试了您的代码。但该值仅附加在最后。这是在页脚之后。我尝试调试代码如下:fp=fopen(FILEPATH,“a”);printf(“当前位置:%d”,ftell(fp));printf(“FSEEK返回:%d”,FSEEK(fp,-43,SEEK_END));printf(“当前位置:%d”,ftell(fp));它打印:当前位置:0 FSEEK返回:0当前位置:142//此值增加等于每次运行的项目。即在最后一次.Pl添加的项目