追加到 C 中文件的末尾

Posted

技术标签:

【中文标题】追加到 C 中文件的末尾【英文标题】:Append to the end of a file in C 【发布时间】:2013-10-26 02:03:32 【问题描述】:

我正在尝试将文件 myfile.txt 的内容附加到 c 中的第二个文件 myfile2.txt 的末尾。我可以复制内容,但我找不到追加的方法。这是我的代码:

FILE *pFile;
FILE *pFile2;
char buffer[256];

pFile=fopen("myfile.txt", "r");
pFile2=fopen("myfile2.txt", r+);
if(pFile==NULL) 
    perror("Error opening file.");

else 
    while(!feof(pFile)) 
        if(fgets(buffer, 100, pFile) != NULL) 
        fseek(pFile2, -100, SEEK_END);
        fprintf(pFile2, buffer);
    

fclose(pFile);
fclose(pFile2);

我认为我没有正确使用 fseek,但我想做的是调用 fseek 将指针放在文件末尾,然后写入该指针的位置,而不是文件的开头。这是正确的方法吗?

【问题讨论】:

(除了下面的答案)您的fseek 想法应该可行,但是由于您使用SEEK_END,因此“指针”已经在最后-并且 then 你“返回”100 个字符。使用0 作为偏移量,它应该可以工作。 (次要:你检查你的阅读文件是否可以打开,但不是你的写作文件。检查两者。) why while( !feof( file ) ) is never correct 第 12 行的错字,大括号没有闭合 【参考方案1】:

使用追加打开:

pFile2 = fopen("myfile2.txt", "a");

那就写信给pFile2,不需要fseek()

【讨论】:

您应该注意,ANSI C 确实需要 fseek() 或其他定位函数。 @Wyatt8740:在哪里?我的标准说:“使用附加模式(a 作为模式参数中的第一个字符)打开文件将导致所有后续对该文件的写入都被强制到当前的文件结尾,而不管干预调用如何到 fseek()。 虽然不是 ANSI C,但它是 ISO C。 来自 GNU 的 man fopen:“请注意,ANSI C 要求文件定位函数在输出和输入之间进行干预,除非输入操作遇到文件结尾。”看起来我读错了,只有在输入和输出之间交替时才会出现。 @Wyatt8740:这很公平,这也是我的经验。虽然我认为如果我同时阅读和写作,我可能会使用比 stdio 更低级别的接口。 将使用“a”从新行或内联追加?【参考方案2】:

按照fopen的文档:

``a'' 打开以供写入。如果文件不存在,则创建该文件。流位于 文件的结尾。对文件的后续写入将始终在当前结束 租用文件的结尾,无论是否有任何干预 fseek(3) 或类似内容。

因此,如果您pFile2=fopen("myfile2.txt", "a");,则流位于末尾以自动附加。做吧:

FILE *pFile;
FILE *pFile2;
char buffer[256];

pFile=fopen("myfile.txt", "r");
pFile2=fopen("myfile2.txt", "a");
if(pFile==NULL) 
    perror("Error opening file.");

else 
    while(fgets(buffer, sizeof(buffer), pFile)) 
        fprintf(pFile2, "%s", buffer);
    

fclose(pFile);
fclose(pFile2);

【讨论】:

以上是关于追加到 C 中文件的末尾的主要内容,如果未能解决你的问题,请参考以下文章

Qt每天一例2.在文件末尾追加字符串

C++每日一练2.在文件末尾追加字符串

使用 ofstream 将文本写入文件末尾

通过shell脚本实现读取文件新增的每一行并追加到另一台服务器的文件末尾

[I/O]将多个源文件中的内容追加保存一个目标文件末尾

Shell实现以下功能: 通过关键词匹配到文件某一行,并在这一行末尾追加内容。