我想将 txt 文件加载到数组中,就像 php 中的 file() 所做的那样。我希望能够访问不同的行,例如 array[N] (它应该包含文件中的整个行 N),然后我需要在使用它后删除每个数组元素,数组将减小大小直到达到 0 并且程序将完成。我知道如何读取文件,但我不知道如何填充要使用的字符串数组,就像我说的那样。我使用gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)进行编译。
我怎样才能实现这个目标?
最佳答案
建议的算法:
- 使用
fseek
、ftell
、fseek
查找结束、确定文件长度以及返回开头。 malloc
一个足够大的缓冲区,可以容纳整个文件加上空终止符。- 使用
fread
将整个文件读入缓冲区,然后在末尾写入0字节。 - 逐字节循环缓冲区并计算换行数。
- 使用
malloc
分配该数字 + 1 个char *
指针。 - 再次循环缓冲区,分配第一个指针指向缓冲区的开头,并分配连续的指针指向换行符后的字节。在此过程中将换行符本身替换为 0(空)字节。
一项优化:如果您不需要随机访问行(按行号索引它们),请取消指针数组,只需用 0 字节替换所有换行符。然后 s+=strlen(s)+1;
前进到下一行。您需要添加一些检查,以确保您不会超出缓冲区的末尾(或者如果您反向执行此操作,则不会超出开头)。
无论哪种方式,这种方法都非常有效(没有内存碎片),但有一些缺点:
- 您无法单独释放线路;您只能在完成后释放整个缓冲区。
- 您必须覆盖换行符。有些人更喜欢将它们保存在内存结构中。
- 如果文件以换行符结尾,则指针数组中的最后“行”长度将为零。在我看来,这是对文本文件的合理解释,但有些人更喜欢将最后一个换行符后面的空字符串视为非行,并且如果最后一行不以换行符结尾,则将其视为“不完整”。
关于c - 纯c中的文本文件到字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209123/