如何使用 fgets 获得整条线

How to get whole line using fgets

本文关键字:何使用 fgets      更新时间:2023-10-16

我需要从不同的流(不仅从stdin)读取数据。我发现了 fgets 函数,可以读取一些有限数量的字符,但我需要像 get 一样获取整个字符串,但我必须指定输入流。请帮助解决此问题。

读取整个文件的正常过程是这样的:

  • 打开文件
  • 寻求终点
  • 读取位置
  • 创建该大小的缓冲区
  • 寻求开始
  • 读入缓冲区
  • 关闭文件

这个网站上的例子正是这样做的:http://www.cplusplus.com/reference/cstdio/fread/

如果你想读取到一个特殊字符,那么只需在一个循环中运行fgets,在那里你使用realloc来调整缓冲区的大小。一种常见的方法是不是每次都增加固定量,而是增加一个值,例如每次循环迭代将其大小加倍。这样,您将执行最多 log(n) 个 realloc 调用。

希望我明白了...您需要的是查找文件结尾(EOF),这是在遇到文件结尾时设置的(猜猜怎么着?)。

至于缓冲区大小

,您可以先检查流大小,以确保为接收缓冲区分配足够的内存。

使用重新分配通常不是一个好的选择。它很慢,仅表明您没有预料到内存需求。除非绝对必要(非常硬的内存约束),否则分配比重新分配更多的资源更好。当然,没有什么比"正确"的分配更胜一筹了。