首页 > 解决方案 > C如何读取新插入文件的内容?

问题描述

我想先写一些东西到一个文件中,然后用fgets它来读取它。但我希望它在不关闭它的情况下工作并在读写之间切换文件打开模式,

我已经尝试r+w+打开文件。对于 r+,它能够读取原始内容,但无法读取新插入的内容。对于 w+ 它没有读取任何内容,我认为这是因为 w+ 清除了原始内容。

我目前发现无法在关闭和切换文件打开模式之前读取文件新插入的内容,尽管fflush新内容已经写入文件并且可以在外部查看。

这是一个用于测试的简单代码片段。

#include <stdio.h>

int main()
{
    FILE *fp = NULL;
    char line[256]; 
    int status;

    /*input by user*/
    scanf("%s", line);

    /*write to a file*/
    fp = fopen("f5.txt", "w+");
    fprintf(fp, "%s", line);
    fflush(fp); /*flush buffer*/

    /*read it*/
    char lineRead[256];
    while (fgets(lineRead, 5, fp) != NULL) {
        puts(lineRead);
    }

    fclose(fp);
}

标签: cfile

解决方案


您不仅可以使用fflush,还可以使用rewindfseekftell(甚至fgetposfsetpos

请注意,任何标准 IO功能都可能失败,您应该检查一下。

在 Linux 上,某些文件(例如fifo(7))是不可搜索的。

也许您想要一些更高级别的方式来在磁盘上存储持久数据。您是否考虑过为索引文件(如gdbm)或数据库(如sqlite)使用一些库?或者甚至使用成熟的数据库,比如一些RDBMS(例如PostGreSQLMySQLMariaDB,它们是免费软件),或者一些NoSQL的东西,例如MongoDB

无法在某个文件的中间插入字节序列或删除(即移除)文件内的字节序列。这是大多数当前操作系统(以及所有常用操作系统,如 Linux & Windows & Android & MacOSX)上文件系统的基本限制。您通常应该将该文件(按块)复制到其他文件中(并且像 gdbm 或 sqlite 这样的库不会这样做,它们要么将一些数据附加到文件的末尾,要么重写文件内的一些字节;它们也可能截断一份文件)。

特别是,如果你想以编程方式在一些小文本文件的中间插入一些行,你通常应该在一些适当的数据结构中完全读取文件,修改内存中的数据结构,然后将该数据结构转储到(覆盖)文件。


推荐阅读