如何在文件C中搜索和替换字符串

时间:2015-03-06 11:07:33

标签: c string file fseek file-pointer

我必须以这种方式修改结构文件中的字符串:

Name: Name1
Surname: Surname1
ID: 00000000
Age: 30


Name: Name2
Surname: Surname2
ID: 00000001
Age: 32

...

我想以这种方式做:我在输入ID时询问,我问他想要改变什么(如果是名字,姓氏,身份证或年龄)然后我问他想要改变它。然后我搜索文件中的ID,如果他想更改姓氏,我将FSEEK移动到-1,对于名称,我将FSEEK移动到-2,或者如果他想改变年龄,我将FSEEK移动到+1。

那么,有更容易的更快速的方法吗?

谢谢:)

2 个答案:

答案 0 :(得分:2)

您无法在文件内插入或删除某些字节序列。您只能覆盖现有字节,或在文件末尾添加新字节(这是<stdio.h>文件的标准化方式,以及POSIX或Windows文件的行为方式,以及几乎每个{{1} 3}} - 我今天不知道任何例外 - 工作)

所以你可以从旧文件中生成一个新文件(然后可能rename新文件作为旧文件。

您还可以读取内存中的所有文件,并从内存中输出全部新内容。

您可能应该考虑更高级别的抽象:索引文件àlafile system或简单数据库àlaGDBM(或真实数据库,如SqlitePostgreSQL等。 ..)

请注意,当前处理器比磁盘快得多(MongoDb近一百万次 - 访问时间为十几毫秒 - 而hard spinning disks可能是千倍 - 访问时间约为百微秒)。因此,花费一些CPU时间来“组织”写入“文件”或“网络”的数据是非常有意义的(并且比上个世纪更多)。

如果使用笔记本电脑或台式机,它今天有很多RAM(几千兆字节),因此很可能所有数据都适合内存。 RAM带宽也远高于磁盘,SSD或网络带宽(并且RAM延迟也低得多)。 如果使用数据库系统管理大量数据(超过千兆字节)是明智的(特别是因为您可能不会立即编写所有数据)。

您可能对SSDserializationapplication checkpointing ....

感兴趣

答案 1 :(得分:1)

这意味着您必须同时打开文件进行读写,这有一些不值得的复杂情况。

我宁愿做以下事情:

  • 打开文件进行阅读
  • 阅读完整记录
  • 检查是否应该更改,并在
  • 中进行更改
  • 将记录写入第二个文件
  • 完成记录后,您可以重命名新文件,覆盖初始文件或保留原样。