[英]How to open a file of any length in C?
作为学校作业,我的任务是编写一个程序,该程序打开任何文本文件并对该文本执行许多操作。 必须使用链接列表加载文本,这意味着包含char指针和指向下一个结构的指针的结构数组。 每个结构一行。
但是我在实际加载文件时遇到了问题。 看来在实际读取文本之前必须先分配将文本加载到内存所需的内存。 因此,我必须多次打开文件。 一次计算行数,然后每行两次; 一次计数该行中的字符,然后一次读取它们。 打开一个文件数百次只是为了将其读入内存似乎是荒谬的。
显然有更好的方法可以做到这一点,我只是不知道它们:-)
例子
fgetc
提取字符的位置吗? 无需多次打开文件,也无需多次通过文件。
查看POSIX getline()
函数。 它将行读入分配的空间。 您可以使用它来读取行,然后将结果复制到链接列表中。
不需要链接列表就可以提前知道有多少行。 这是列表的优势。
因此,可以通过一次编码来完成代码。 即使您不能使用getline()
,也可以使用fgets()
并监视它每次是否读到行尾,如果不行,则可以根据需要分配(并重新分配)空间以容纳行( malloc()
, realloc()
并最终从<stdlib.h>
free()
)。
如果您采用我建议的任何方法,则您的具体问题在很大程度上无关紧要,但是:
使用fseek()
(在极端情况下,使用rewind()
)将移动读取指针(对于fgetc()
和所有其他函数),除非“文件”不支持查找(例如,将管道作为标准输入提供)。
可以使用stat()
或fstat()
或变体确定字符。 只能通过读取文件来确定行数。
由于文件的大小可能从零字节到千兆字节,因此没有明智的方式来进行固定大小的分配。 使用malloc()
等,您几乎被迫进行动态内存分配。 (在后台, getline()
使用malloc()
和realloc()
。)
如果不实际遍历文件,则无法计算文件的行数。 您可以得到文件的总大小,但这不是这里要的。 使用链接的行列表的想法是您一次在文件上处理一行。 您不需要事先阅读任何内容。 当您尚未阅读整个文件时,请阅读一行,然后将其添加到链表末尾的自己的节点中,然后移至下一行。
关于第一个问题:您可以使用fseek()函数更改正在读取的文件中的位置。
您可以通过几种方法来执行此操作。 例如,您可能有一个固定大小的缓冲区,用文件中的字节填充该缓冲区,将缓冲区中的行复制到列表中,再次填充该缓冲区,依此类推。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.