c - 读取和附加到同一个文件

标签 c file

我是 C 编程的新手,只是编写了一个简单的程序来读取文本文件中的所有行并将每个数字替换为一个新数字。这是我的代码。它为每一行打印到控制台,但不打印到文件。有人可以建议我的代码有什么问题吗?

#include <stdio.h>
int main(int argc, char *argv[])
{
    FILE * file_ptr;
    int num; 
    char line[128];
    file_ptr = fopen (argv[1], "a+");
    if(file_ptr==NULL)
    {
        printf("Error opening file");
    }

    if(file_ptr!=NULL)
    {
        while(fgets(line,128,file_ptr)!=NULL)   
        {
            fputs("df",file_ptr);   
            printf("2");
        }
    }

    fclose(file_ptr);
    return(0);
}

最佳答案

问题是您正在从同一个文件读取和写入,并且您的读取和写入是相互作用的。

a+ 模式打开文件(追加,允许读取)将文件位置设置在文件的开头,因此第一次调用 fgets 会读取第一个线。但在附加模式下,所有写入都在文件末尾执行。因此第一次调用 fputs 将文件位置设置为文件末尾,然后写入 df。由于读取和写入只有一个文件位置,因此下一次调用 fgets 会在文件末尾执行,并且不会读取任何内容。

文件位置的行为使得 a+ 模式最适用于您想要读取文件的全部当前内容然后在末尾添加内容的情况。

请注意,修改文件中间内容的唯一方法是将一个字节序列替换为一个具有相同长度的字节序列。所以你可以用df替换12,但是你不能用df替换123:如果你设置123 所在的文件位置并写入 df,您将得到 df3。要用长度可能不同的字符串替换数字,您需要重写整个文件

当你想彻底修改一个文件时,主要有以下三种技术:

  • 加载内存中的当前内容,将文件截断为0,写入新内容。
  • 打开当前文件进行读取,新建一个文件,将新内容写入新文件,关闭旧文件,然后移动(重命名)新文件覆盖旧文件。
  • 重命名旧文件,用原来的名称创建一个新文件,从重命名的文件中读取当前内容,写入新内容并关闭文件。

第一种方法有一个很大的缺点:如果你的程序崩溃或者电脑断电,文件就会丢失。因此,您几乎应该始终使用其他两种方法中的一种:它们使用更多磁盘空间,但增加的安全性几乎总是值得的。

关于c - 读取和附加到同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27573677/

相关文章:

c++ - 我在 C 中遇到指针问题

c - 在 Linux 上,\n 在使用 gcc 编译器的 gdb 中被视为两个字符

c - mariadb c api windows undefined reference to

c - C中同名的外部变量和全局变量

php - 无法将文件上传到网络服务器

关闭文件句柄上的 Perl Readline - 文件不存在错误

c++ - 如何使用 FFmpeg C API 对 H.264 视频进行编码,然后使用媒体播放器打开输出?

javascript - 如何从 window.location.pathname 获取文件名

c - 文件读\写中的链表

sql - 如何使用 T-SQL 在 SQL Server 中输出非结构化文件?