将项附加到c中最后一行之前的文件中
当新项目添加到文件中时,页脚应随当前时间和小时更新。 这是示例文件格式 项目1将项附加到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//更改页脚 请帮助我完成此操作。因为页脚行是静态长度 查找页脚行的开头,在其上写下新项目,然后换行,然后写出新的页脚
项目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添加的项目