【问题标题】:effectively work with files in c [closed]有效地处理c中的文件[关闭]
【发布时间】:2013-11-05 19:15:01
【问题描述】:

我想用c编写小型数据库,数据将存储在文件中,程序将读取和写入文件结构。 我如何有效地创建这种程序? 例如,一次从文件中读取一个结构将效率不高(导致对 hdd 进行多次读/写)。所以我需要将文件的一部分放到内存中操作数据然后将其写入文件(更少的读取/写入硬盘),但是如果文件太大,这可能会导致问题,所以有一个新问题如何每次该文件的大部分内容都会加载到内存中..

所以这是个大话题,但我正在寻找有效的方法,但同时也有一些简单的方法,我不是在寻找最大的效率。 注意:对我来说简单的是一次一个结构。

谢谢。

【问题讨论】:

  • 即使我这样做?while(1){ fread(&cli,sizeof(Client),1,fp); if(!feof(fp)){...我不认为这是有效的......
  • 不,fopen,然后fseek到你要写的记录,fwrite,fclose。
  • 使用 fseek 我仍然需要搜索我想要的记录,所以我循环遍历文件,效率不高。
  • 好的,使用 sqlite,请看下面的答案。
  • 我知道什么是 sqlite.. 我正在寻找没有编码数据库的解决方案。

标签: c file data-structures


【解决方案1】:

“一次从文件中读取一个结构体将效率不高(导致多次读取/写入硬盘)”

这是一个很大的假设,很可能是错误的。或者至少没有你想象的那么糟糕。

C 标准 I/O 库执行缓冲,您的操作系统也是如此。

从清晰的程序组织的角度,编写程序以方便的单元进行数据传输,并让缓冲完成聚合工作以提高效率。

即使该程序确实表现不佳,我也不会草率地得出需要对其进行重大重组的结论。调整一些系统参数可能是要走的路。或者可能只是几行特定于平台的代码,以提示操作系统可以提高性能。例如,在 POSIX 平台上,查看您是否具有函数 fadvise。 (您可以使用fileno 函数从FILE * 流中检索文件描述符。)

【讨论】:

  • 你觉得这段代码效率如何,while(1){ fread(&cli,sizeof(Client),1,fp); if(!feof(fp)){...
  • @MikeL 我认为fread 有一个应该测试的返回值,而sizeof cli 是获取cli 大小的完美方法,而不是参考它声明的类型,可能会改变。但就效率而言,将fread 用于一个结构并没有什么问题。
猜你喜欢
  • 2017-02-02
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多