【问题标题】:Append to the end of a file in C在 C 中追加到文件的末尾
【发布时间】:2023-03-02 21:56:02
【问题描述】:

我正在尝试将文件 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 作为偏移量,它应该可以工作。 (次要:你检查你的阅读文件是否可以打开,但不是你的写作文件。检查两者。)
  • 第 12 行的错字,大括号没有闭合

标签: c file append fseek


【解决方案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);

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 2011-08-19
    • 1970-01-01
    • 2011-11-25
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多