c - 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);
}
解决方案
您不仅可以使用fflush,还可以使用rewind、fseek、ftell(甚至fgetpos和fsetpos)
请注意,任何标准 IO功能都可能失败,您应该检查一下。
在 Linux 上,某些文件(例如fifo(7))是不可搜索的。
也许您想要一些更高级别的方式来在磁盘上存储持久数据。您是否考虑过为索引文件(如gdbm)或数据库(如sqlite)使用一些库?或者甚至使用成熟的数据库,比如一些RDBMS(例如PostGreSQL或MySQL或MariaDB,它们是免费软件),或者一些NoSQL的东西,例如MongoDB?
无法在某个文件的中间插入字节序列或删除(即移除)文件内的字节序列。这是大多数当前操作系统(以及所有常用操作系统,如 Linux & Windows & Android & MacOSX)上文件系统的基本限制。您通常应该将该文件(按块)复制到其他文件中(并且像 gdbm 或 sqlite 这样的库不会这样做,它们要么将一些数据附加到文件的末尾,要么重写文件内的一些字节;它们也可能截断一份文件)。
特别是,如果你想以编程方式在一些小文本文件的中间插入一些行,你通常应该在一些适当的数据结构中完全读取文件,修改内存中的数据结构,然后将该数据结构转储到(覆盖)文件。
推荐阅读
- charts - 谷歌图表,y轴未排序,无法修复
- functional-programming - 如何在 OCaml 中进行函数覆盖?
- c++ - 滑动窗口最大值问题中的分段错误
- java - 在 Eclipse 项目中哪里可以找到文件
- node.js - 找不到入口模块中的错误:错误:无法解析“./src”
- android - Android 应用程序在安装 @react-native-firebase/messaging (v6) 时崩溃
- ocaml - 字符串 printf 的 Ocaml 循环
- vba - 为什么访问 Vb 代码中的这段代码给了我语法错误编译器错误
- java - 开发 Minecraft 插件时遇到问题
- c# - 我想将 XERO 集成到 WebAPI C# 有人可以为我提供 oauth2 的示例代码吗