c - 纯c中的文本文件到字符串数组?

标签 c linux arrays file file-io

我想将 txt 文件加载到数组中,就像 php 中的 file() 所做的那样。我希望能够访问不同的行,例如 array[N] (它应该包含文件中的整个行 N),然后我需要在使用它后删除每个数组元素,数组将减小大小直到达到 0 并且程序将完成。我知道如何读取文件,但我不知道如何填充要使用的字符串数组,就像我说的那样。我使用gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)进行编译。

我怎样才能实现这个目标?

最佳答案

建议的算法:

  1. 使用 fseekftellfseek 查找结束、确定文件长度以及返回开头。
  2. malloc 一个足够大的缓冲区,可以容纳整个文件加上空终止符。
  3. 使用fread将整个文件读入缓冲区,然后在末尾写入0字节。
  4. 逐字节循环缓冲区并计算换行数。
  5. 使用 malloc 分配该数字 + 1 个 char * 指针。
  6. 再次循环缓冲区,分配第一个指针指向缓冲区的开头,并分配连续的指针指向换行符后的字节。在此过程中将换行符本身替换为 0(空)字节。

一项优化:如果您不需要随机访问行(按行号索引它们),请取消指针数组,只需用 0 字节替换所有换行符。然后 s+=strlen(s)+1; 前进到下一行。您需要添加一些检查,以确保您不会超出缓冲区的末尾(或者如果您反向执行此操作,则不会超出开头)。

无论哪种方式,这种方法都非常有效(没有内存碎片),但有一些缺点:

  • 您无法单独释放线路;您只能在完成后释放整个缓冲区。
  • 您必须覆盖换行符。有些人更喜欢将它们保存在内存结构中。
  • 如果文件以换行符结尾,则指针数组中的最后“行”长度将为零。在我看来,这是对文本文件的合理解释,但有些人更喜欢将最后一个换行符后面的空字符串视为非行,并且如果最后一行不以换行符结尾,则将其视为“不完整”。

关于c - 纯c中的文本文件到字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209123/

相关文章:

对这个 Y86 汇编代码的内存位置感到困惑

C 类型声明 intN_t

c++ - 什么时候使用动态数组而不是静态数组合适?

java - 在Java中递归地将数组中的对象与另一个对象相乘

c - 由于一个分号,函数无法编译,我不知道为什么

c - 为什么它不根据记录显示输出?

php - Linux 中的 scandir 重音问题在 OSX 中工作正常

linux - Mac OS 文件路径与 Windows 文件路径的等效文件路径

c - 使用串口时收到额外的空字节

ios - 检查数组是否包含某个对象(iOS)