我想将一个txt文件加载到像php()中的file()那样的数组中。我希望能够访问不同的行,如数组[N](应该包含文件中的整行N),然后我需要删除每个数组元素后使用它将减小大小,直到达到0和程序将完成。我知道如何读取文件,但我不知道如何填充字符串数组,就像我说的那样。我正在使用gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5)进行编译。
我怎样才能做到这一点?
答案 0 :(得分:2)
建议的算法:
fseek
,ftell
,fseek
寻求结束,确定文件长度,然后重新开始。malloc
一个足够大的缓冲区,用于整个文件加上空终止。fread
将整个文件读入缓冲区,然后在末尾写入0字节。malloc
分配该数字+ 1 char *
指针。一个优化:如果您不需要随机访问这些行(按行号索引它们),请取消指针数组,只需用0字节替换所有换行符。然后s+=strlen(s)+1;
前进到下一行。您需要添加一些检查以确保您不会超过缓冲区的结束(或者如果您正在反向执行此操作,则开始)。
无论哪种方式,这种方法非常有效(没有内存碎片)但有一些缺点:
答案 1 :(得分:1)
我建议您将文件读入一个指向字符串的指针数组,这样您就可以按照指定的方式索引和删除这些行。使用这种方法需要考虑效率权衡,以便在读取每一行时是提前计算行数还是分配/扩展数组。我会选择前者。
\n
或\r\n
)malloc()
为每个文件分配缓冲区并由下一个数组索引指向对于您的运营:
array[N]
array[N]
索引的缓冲区并将array[N]
条目设置为NULL
更新:
@r .. 和 @ marc-van-kempen 建议的内存效率更高的方法是优于malloc()
每行的优化时间,即将文件粘贴到单个缓冲区中并用'\0'
替换所有行终止符
假设你已经完成了这个并且你有一个大的缓冲区char *filebuf
并且行数是int num_lines
那么你可以分配你的索引数组:
char *lines[] = (char **)malloc(num_lines + 1); // Allocates array of pointers to strings
lines[num_lines] = NULL; // Terminate the array as another way to stop you running off the end
char *p = filebuf; // I'm assuming the first char of the file is the start of the first line
int n;
for (n = 0; n < num_lines; n++) {
lines[i] = p;
while (*p++ != '\0') ; // Seek to the end of this line
if (n < num_lines - 1) {
while (*p++ == '\0') ; // Seek to the start the next line (if there is one)
}
}
使用单个缓冲区方法“删除”一行只是将lines[n]
设置为NULL
的情况。有没有 free()
答案 2 :(得分:1)
两种略有不同的实现方式,一种是内存友好,另一种更友好。
我记忆中的友好
II cpu friendly