如果不知道要读取的字符数,如何使用 fgets?

2023-11-22

我需要读取一个文件并将其中的文本发送到一个字符串,以便我可以解析它。但是,程序不会确切知道文件有多长,所以如果我想使用我该怎么办fgets(),或者有更好的选择吗?

Note:

char *fgets(char *str, size_t num, FILE *stream);

别忘了fgets()一次读取一行,前提是有足够的空间。

人类写的行很少长于……80、256,选择一个数字……字符。 POSIX 建议行长度为 4096。所以,我通常使用:

char buffer[4096];

while (fgets(buffer, sizeof(buffer), fp)) 
{
    ...process line...
}

如果您担心有人可能会在一行中提供超过 4K 的数据(机器生成的文件,例如 HTML 或 JSON,可能包含该数据),那么您必须决定下一步要做什么。您可以执行以下任一操作(可能还有一些我没有提到的其他选项):

  1. 按位处理过长的行,而不假设中间有换行符。
  2. 为较长的行分配内存(例如从 8K 开始),将初始的 4K 复制到分配的缓冲区中,然后将更多数据读取到缓冲区的后半部分中,迭代直到找到行尾。
  3. 使用 POSIX 2008 函数getline()它可以在 Linux 上使用。它为你分配内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果不知道要读取的字符数,如何使用 fgets? 的相关文章

随机推荐

  • angular2 不会根据真或假条件禁用输入

    我有一个基于以下内容的输入框 如果更改无线电 我会看到该值变为 true 或 false pre model parameters general estimationmethod ew pre 那么哇为什么输入框会根据true为false
  • 按两个值对数组进行排序

    假设我有 an array 2 3 1 4 1 3 2 1 1 2 我想按每个内部数组的第一个值对该数组进行排序 然后按第二个值排序 因此排序后的数组应如下所示 1 2 1 3 1 4 2 1 2 3 执行此操作最易读的方法是什么 这是排序
  • 如何在 tableView:heightForRowAtIndexPath: 中初始化 NSAttributedString 隐式递归?

    我在计算高度时遇到一个非常奇怪的问题UITableViewCell 好像如果我实例化一个NSAttributedString with NSData包含一些 HTML 在当前视图上强制布局循环 最终调用tableView heightFor
  • Android Studio 3.0 Beta4 上的 Dex 错误

    Error java lang RuntimeException java lang RuntimeException com android builder dexing DexArchiveMergerException Unable
  • 破折号和参数是否有标准的命令行约定? [复制]

    这个问题在这里已经有答案了 关于何时使用 2 个破折号 1 个破折号或根本不使用任何选项而仅按顺序读取输入的命令行约定是什么 我意识到有很多变体 但是是否有任何约定能够成为行业标准 比如 Java C 或 Python 阅读背景部分Pyth
  • x时间后自动删除所有文件

    如何在 x 时间后 假设 24 小时后 自动删除子目录下的所有文件 无需使用服务器或 pl 中的 cronjob 命令 如何仅使用 PHP 代码或仅访问页面而不单击某些内容并且命令自动运行来做到这一点 对我第一个答案的最后一条评论的回复 我
  • c# Asp.net 获取在 javascript 中设置的 Cookie 过期时间始终返回 01.01.0001

    我使用 JavaScript 函数来存储 cookie createCookie teaser teaser 7 function createCookie name value days var expires if days var d
  • 什么是 LCID 127?

    在 asp net 中 LCID 127 代表什么文化 输出 127 这就是 不变文化 即没有文化 See 这个清单LCID 和相关文化 它是第一个 127 0x007F
  • 重置子文件夹的 htaccess

    我的根文件夹中有一个 htaccess 文件 其中包含一些基本代码 但我希望目录 voxelforum com 中的所有这些指令都被忽略 我怎样才能实现这个目标 Thanks 奇怪的是 您可能首先需要关闭重写 然后再次打开它 Put a h
  • 路由角度 5 中的破折号分隔参数

    我想用破折号分隔 URL 中的参数 如下所示 localhost add 5 ninja 这里的 id 是 5 名字是 ninja 当我将配置更改为 path id name 它无法正常工作 如何在 URL 中创建破折号分隔的参数 我认为按
  • 在MVC3中的DropDownList中设置默认选定值

    在 MVC3 中 我的控制器上有这段代码 它从安装表中检索 ID Names 列表并创建一个 ViewBag var vs dba Installation OrderBy q gt q InstName ToList ViewBag Ve
  • 如何在formik中禁用提交时自动重置表单?

    我有一个由 formik 控制的表单 当我填写所有字段并按下按钮提交时 该功能onSubmit被调用 我的表单已重置该值 有时我的数据不正确 例如重复的电子邮件 我需要保留这些数据 我怎样才能做到这一点 这是我的代码 const schem
  • ASP.Net DropDownList OnSelectedIndexChange 未触发

    我有以下 DropDownList 控件
  • 在达到 30 秒限制之前抛出 AppEngine 数据存储区超时错误

    使用 AppEngine Go 从大约 40k 实体的表中读取数据时 我总是看到此错误 API 错误 5 datastore v3 TIMEOUT 数据存储操作超时 或数据暂时不可用 这是在查询触发后 400 毫秒内发生的 除了达到挂钟的限
  • Rails 克隆副本或重复

    我有一个嵌套表单 保存后 我希望能够单击显示页面上的链接来复制或克隆该表单并打开一个新表单 从那里我应该能够进行编辑 例如新的 ID 并保存为新记录 我见过一些这样的例子deep cloneable 宝石 但我不知道如何实现它 我认为这应该
  • 线程是否可以先通过安全发布获取对象,然后再不安全地发布它?

    读完后我想到了这个问题这个答案 代码示例 class Obj1 int f1 0 volatile Obj1 v1 Obj1 v2 Thread 1 Thread 2 Thread 3 var o new Obj1 o f1 1 v1 o
  • ClipsToBounds 似乎在 UIStackView 中没有效果

    是否可以在外部渲染子视图UIStackView 我有一个带有按钮和标签的垂直堆栈视图 并且我使用堆栈视图的宽度来适当设置按钮的高度和宽度 addArrangedSubview self loginMethodButton let width
  • 在 MVC 网络核心中找不到 Swagger 页面 404

    我有一个全新的 NET Core Web API 项目 我想使用 API 版本控制和 swagger 当我尝试查看 swagger 页面时 出现 404 错误 但是 模板附带的默认 ValuesController 可以正常工作 这是我的设
  • 如何消除子图之间和周围的间隙[重复]

    这个问题在这里已经有答案了 我正在一张图中绘制两个子图 2x1 我想删除两个子图之间的所有间距 并删除顶部子图的 xlable 和 xlabel 刻度 另外 我正在尝试删除子图之外的所有间距 我尝试 set gca LooseInset g
  • 如果不知道要读取的字符数,如何使用 fgets?

    我需要读取一个文件并将其中的文本发送到一个字符串 以便我可以解析它 但是 程序不会确切知道文件有多长 所以如果我想使用我该怎么办fgets 或者有更好的选择吗 Note char fgets char str size t num FILE