繁体   English   中英

如何在C中打开任何长度的文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM