如何使用 fgets 获得整条线
How to get whole line using fgets
我需要从不同的流(不仅从stdin)读取数据。我发现了 fgets 函数,可以读取一些有限数量的字符,但我需要像 get 一样获取整个字符串,但我必须指定输入流。请帮助解决此问题。
读取整个文件的正常过程是这样的:
- 打开文件
- 寻求终点
- 读取位置
- 创建该大小的缓冲区
- 寻求开始
- 读入缓冲区
- 关闭文件
这个网站上的例子正是这样做的:http://www.cplusplus.com/reference/cstdio/fread/
如果你想读取到一个特殊字符,那么只需在一个循环中运行fgets,在那里你使用realloc来调整缓冲区的大小。一种常见的方法是不是每次都增加固定量,而是增加一个值,例如每次循环迭代将其大小加倍。这样,您将执行最多 log(n) 个 realloc 调用。
希望我明白了...您需要的是查找文件结尾(EOF),这是在遇到文件结尾时设置的(猜猜怎么着?)。
至于缓冲区大小,您可以先检查流大小,以确保为接收缓冲区分配足够的内存。
使用重新分配通常不是一个好的选择。它很慢,仅表明您没有预料到内存需求。除非绝对必要(非常硬的内存约束),否则分配比重新分配更多的资源更好。当然,没有什么比"正确"的分配更胜一筹了。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 如何使用 FGETS 获取文本,并保存 std::string
- 在C++中使用哪个函数来输入多个单词,比如C中的fgets
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- C++:使用 fgets() 读取字符输入时出错
- 使用 fgets() c++ 读取大型 txt 文件时的 CPU 使用率为 99%
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 在std::cout之后使用std::cin时,换行符从何而来
- 当我使用 scanf_s 时我得到 4,但当我使用 fgets() 时得到 1
- 如何使用 fgets 获得整条线
- 为什么以及在何处在C++中使用引用和指针
- "Sams teach yourself C" 中的示例 使用"fgets"但返回错误
- 基例如何影响使用递归函数的哪些行
- 使用select()和fgets()从串行端口访问信息