0

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

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


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

...

我想这样做:我问输入ID,我问他想改变什么(如果是名字,姓氏,ID或年龄)然后我问他想改变什么。然后我在文件中搜索 ID,如果他想更改姓氏,我将 FSEEK 移至 -1,对于名称,我将 FSEEK 移至 -2,或者如果他想更改年龄,我将 FSEEK 移至 +1。

那么,有没有更简单或更快捷的方法来做到这一点?

谢谢 :)

4

2 回答 2

2

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

因此,您可以从旧文件生成一个新文件(然后可能rename是旧文件)。

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

您可能应该考虑更高级别的抽象:索引文件à la GDBM或简单数据库à la Sqlite(或真正的数据库,如PostgreSQLMongoDb等......)

请注意,当前的处理器比磁盘快得多(硬盘旋转磁盘接近一百万倍 - 访问时间在几十毫秒内 - 并且SSD可能数千倍- 访问时间大约一百微秒)。因此,花一些 CPU 时间来“组织”写入“文件”或“网络”的数据是很有意义的(而且比上个世纪要多得多)。

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

您可能对序列化应用程序检查点JSON ....感兴趣。

于 2015-03-06T11:10:58.090 回答
1

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

我宁愿做以下事情:

  • 打开文件进行阅读
  • 阅读整条记录
  • 检查它是否应该更改并更改以防万一
  • 将记录写入第二个文件
  • 完成记录后,您可以重命名新文件以覆盖初始文件或保持原样。
于 2015-03-06T11:12:45.887 回答