c++ - 在不使用 C/C++ 使用第二个文件的情况下插入文件而不覆盖

标签 c++ c file text

下面是一个文本文件中的内容。

name1: 1234
name2: 2000
name3: 3000

这是一个现有的文本文件,我想用文本文件中的另一个值(比如 12345)替换一个值(比如 1234)。所以我将光标放在值的开头(这里是第 7 个位置)。然后我使用了以下语句:

fprintf(filepointer,"12345\n");

生成的文件是这样的

name1: 12345
ame2 : 2000
name3 : 3000

它覆盖了 4 个字符(“1000”)和一个换行符('\n'),并用 5 个字符(“12345”)和一个换行符('\n')覆盖了 'n'。

我知道的解决方案是:
1.覆盖整个文件以增加一个额外的字符。
2.复制链表节点中的每一行,改变内存中的字符写入同一个文件。
3. 创建一个临时文件并将新字符复制到临时文件中的所需位置并将临时文件的名称更改为源文件名并删除源文件。

我还尝试添加回车符 '\r' 和 EOF ('\r\n') 的 Windows 格式,下一行字符仍然被覆盖。我还使用 [SetEndOfFile][1] API 扩展了文件大小,但我仍然面临同样的问题。我搜索了很多论坛并找到了诸如“不覆盖就无法插入字符”之类的答案。

有没有解决办法只插入字符而不覆盖文件中间的字符。或在一行中插入字符而不影响下一行的任何逻辑。
提前致谢。

是否可以使用 visual studio VC++ ??
谢谢:)

最佳答案

顺序文件是呃...只是顺序。所有字节都相互跟随,没有行或任何其他结构的概念。

底层文件系统允许的唯一操作是(只说写):

  • 替换文件中任意位置的字节
  • 在文件的末尾添加字节
  • 截断文件(或通过移动文件末尾在末尾添加随机(*)字节

没有在中间插入的规定,所以没有语言能够做到这一点(除非在幕后进行覆盖)

(*) 如果将文件末尾向前移动多个逻辑 block (文件系统意义),许多文件系统将创建一个空洞,它是一个不使用任何空间的幻影 block 磁盘并被读取为空字节

关于c++ - 在不使用 C/C++ 使用第二个文件的情况下插入文件而不覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37320407/

相关文章:

java - 除了 FileNotFoundException 之外,Files.size(Path) 还可以抛出哪些异常?

c++ - 在 Qt QProcess 中运行 sudo 命令

c++ - 如何仅使用标准库确定强类型的基类型是否为 std::array<char, N>

c - 尝试研究 MPEG Layer-III 编码器 - 在“错误”之前获取 "expected ' =', ' ,', ' ;', ' asm' 或 '__attribute__'

c - 如何绕过已连接的聚会

java - Eclipse启动和ant启动以不同的编码生成文件

asp.net - 在 table 上显示文件。网络平台

c++ - 套接字编程和一般应用程序中对 localhost 的需求是什么?

c++ - 有没有办法从服务中运行可执行文件?

c - 未定义的函数引用使用 argv[1] 将文件名传递给其他函数并读取数据结构