在 C 中从文件中读取长行时处理内存

2023-12-06

首先,我知道这个问题非常接近这个话题,但是这个问题的措辞非常糟糕,我什至不确定它是重复的,而且没有显示代码,所以我认为应该正确地询问它。

我正在尝试逐行读取文件,并且我需要将一行特别存储在variable。我已经成功地使用轻松地做到了这一点fgets,尽管如此要读取的行的大小 and 行数在文件中仍然未知.
我需要一种方法来正确分配内存variable无论线的大小如何,使用 C 而不是 C++.

到目前为止我的代码看起来像这样:

allowedMemory = malloc(sizeof(char[1501])); // Checks if enough memory
if (NULL == allowedMemory)
{
    fprintf(stderr, "Not enough memory. \n");
    exit(1);
}
else
    char* res;
    res = allowedMemory;
while(fgets(res, 1500, file)) // Iterate until end of file
{
    if (res == theLineIWant) // Using strcmp instead of ==
        return res;
}

这段代码的问题是它根本不具有适应性。我正在寻找一种方法来分配足够的内存res这样我就不会错过任何数据line.

我在想这样的事情:

while ( lineContainingKChar != LineContainingK+1Char) // meaning that the line has not been fully read
// And using strcmp instead of ==
  realloc(lineContainingKChar, K + 100) // Adding memory

但我需要迭代两个FILE对象来填充这些变量,这不会很有效。 任何有关如何实施此解决方案的提示或有关如何以更简单的方式实施的建议将不胜感激。

编辑:似乎使用getline()是最好的方法,因为该函数会分配自己所需的内存并在需要时释放它。尽管如此,我不认为它是 100% 可移植的,因为尽管我已经包含了它,但我仍然无法使用它<stdio.h>。不过有待验证,因为我的问题通常位于键盘和计算机之间。在那之前,我仍然对不使用 POSIX 兼容 C 的解决方案持开放态度。


getline()似乎完全符合您的要求:

描述

The getdelim()函数应从流中读取,直到遇到 与分隔符匹配的字符。

...

The getline()函数应等效于getdelim()函数与delimiter字符等于<newline>特点。

...

EXAMPLES

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
    FILE *fp;
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    fp = fopen("/etc/motd", "r");
    if (fp == NULL)
        exit(1);
    while ((read = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu :\n", read);
        printf("%s", line);
    }
    if (ferror(fp)) {
        /* handle error */
    }
    free(line);
    fclose(fp);
    return 0;
}

And per Linux 手册页:

描述

getline()从流中读取整行,存储地址 包含文本的缓冲区*lineptr。缓冲区为空 终止并包含换行符(如果找到)。

If *lineptr被设定为NULL and *n在调用前设置为 0,则getline()将分配一个缓冲区来存储该行。这个缓冲区 应由用户程序释放,即使getline() failed.

或者,在致电之前getline(), *lineptr可以包含一个 指向一个的指针malloc(3)- 分配的缓冲区*n字节大小。如果 缓冲区不够大,无法容纳该行,getline()调整它的大小 和realloc(3), 更新*lineptr and *n有必要的。

无论哪种情况,在成功调用后,*lineptr and *n将 更新以分别反映缓冲区地址和分配的大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 中从文件中读取长行时处理内存 的相关文章

  • 按成员序列化

    我已经实现了template
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 在 String.Format 中插入格式化字符?

    我用谷歌搜索了这个 但 VB Net 2008 似乎不允许在 String Format 中插入格式化字符 例如 t r n BAD MessageBox Show String Format 0 tab 1 Foo Bar BAD Mes
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 活动记录,其中连接表记录不存在

    我正在尝试获取连接表中不存在的所有记录的列表 这些模型是 User Game 和 MarkedGame 其中用户可以将游戏标记为已玩 这是多对多的关系 User gt MarkedGame lt Game 我想要的是所有游戏的列表haven
  • JavaScript 查询字符串[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何 JavaScript 库可以根据查询字符串创建字典 ASP NET style 可以使用的东西 例如 var query window
  • 具有标准样式的谷歌地图自定义按钮

    有没有办法使用最新的 API 将自定义按钮添加到 Google 地图 以便它使用与其他标准按钮相同的样式 我将感谢演示该解决方案的示例代码 没有可以应用的默认类或其他任何东西 当 Google 地图更改时 您必须跟进开发并更改样式 对于当前
  • phpseclib sftp 使用私钥和密码连接

    无论如何 是否可以使用 phpseclib 或任何其他方法使用私钥和 ftp 密码连接 sftp SFTP 服务器同时使用密码和公钥身份验证的情况很少见 我的猜测是 您最有可能拥有的是受密码保护的私钥 如果是这样 您可以这样登录
  • 如何从 PHAsset 获取图像 URL?是否可以使用 PHAsset URL 将图像保存到文档目录?

    I used NSURL urlA info valueForKey PHImageFileURLKey 但是当我尝试使用 URL 保存图像时 URL 为零 NSData pngData NSData dataWithContentsOfU
  • 正则表达式使用Python正则表达式在文件中查找函数调用?

    我想要一个正则表达式 我将把它与 Python re 模块一起使用 它将在 python 文件中查找 python 函数调用 但我正在查找的函数调用周围会有一些警告 函数调用将有一个特定的名称 函数调用可以是链式的 但只有一个链式调用始终具
  • 传奇中的公共交通延迟响应

    我正在研究在公共交通中使用传奇来协调跨多个服务的活动 传奇的生命周期很短 如果一切顺利的话不到 2 秒 对于我的用例 我想使用请求 响应方法 即客户端请求命令 saga 处理该命令 在接收消息时经历一些状态更改 并最终响应启动 saga 的
  • 添加同一片段的多个实例

    我正在尝试将同一片段的多个实例添加到活动中 示例代码是 FragmentManager fm getSupportFragmentManager Fragment fragment fm findFragmentById R id frag
  • 对象... 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中的 是什么意思 Java 数组参数 声明 语法 谁能确认我所看到的是否正确Object 下面的方法调用中的参数 public static void setValues PreparedS
  • 使用 opencv 计算虚拟相机的单应性

    我有一个平面图像 我想计算一个图像扭曲 它可以为我提供从位于 3d 空间中另一个点的虚拟相机看到的同一平面的合成视图 因此 给定图像 I1 我想计算代表从虚拟相机看到的图像 I1 的图像 I2 理论上 存在将这两个图像关联起来的单应性 给定
  • 如何使 LinearLayout 可滚动?

    我的屏幕上有很多项目 我需要使用滚动条 以便用户可以向下滚动 但是 滚动条要么不可见 要么不起作用 如何给页面添加滚动条LinearLayout 用 a 包裹线性布局
  • 如何在 Perl 中从 HTML 中提取 URL 和链接文本?

    我之前问过如何在 Groovy 中做到这一点 但是 由于所有 CPAN 库 现在我正在用 Perl 重写我的应用程序 如果页面包含这些链接 a href http www google com Google a a href http ww
  • 如何设置网站图标?

    我正在尝试做一个非常简单的初步练习来建立一个创建网站图标的网站 这是我正在使用的代码 但它不起作用 有人可以帮忙吗 我已将文件 favicon ico 保存在与 html 文件相同的级别 在子目录中 非常感谢 随着 i android wi
  • 什么是 .pid 文件以及它包含什么?

    我最近遇到了一个扩展名为 pid 的文件 并查看了它的内部 但没有找到太多内容 这文档 says Pid 文件是包含进程标识号 pid 的文件 该文件存储在文件系统的明确定义位置 从而允许其他程序找到正在运行的脚本的 pid 任何人都可以对
  • 关于 Objective-C/Cocoa 中工厂方法对象生命周期的问题(保留或不保留...)

    通过阅读 SDK 中的内存管理文档 我发现工厂方法 静态构造函数方法 通常会为我保留该对象并将其添加到自动释放池中 这意味着只要池没有在我预期之前释放 我就不需要保留和释放对象 对于 main 中的默认自动释放池 这应该位于应用程序的末尾
  • 在多个号码字段中搜索多个号码

    ID 1 5 1 6 3 4 1 36 1 我有这些 1 6 36 要搜索的号码 它应该找到包含 1 OR 6 OR 36 的任何行 例如上表中总共 4 行 I tried FIND IN SET ID 1 6 36 ID IN 1 6 3
  • AngularJs 无限循环

    以下index html页面导致无限循环 重现 在 本地或远程 Web 服务器上下载下面链接的 github 项目 我已经在 plunker 上尝试过 并且没有发生无限循环 从您的浏览器请求它 单击页面上的 p1p2 链接 无限循环开始 在
  • MySQL5.6卡在进程“试图启动服务”上

    我获得了适用于 Windows 7 32 位的 MySQL 5 6 社区服务器版本 还下载了相同 Windows 版本的 Windows 安装程序 一切准备都正确 我在博客上看到给我一份在 winodws7 32 位上安装 MySQL 5
  • 如何找到向量的重复元素并输出该重复项的整数外观而不是逻辑值?

    我们知道 duplicate 函数输出一个逻辑向量 然而 我想要的是一个整数向量 如果这是该特定元素第 n 1 次出现 则输出向量的相应元素为 n 例如 如果我们调用我正在寻找的函数 intDuplicate 那么我需要以下输出 gt x
  • 在 C 中从文件中读取长行时处理内存

    首先 我知道这个问题非常接近这个话题 但是这个问题的措辞非常糟糕 我什至不确定它是重复的 而且没有显示代码 所以我认为应该正确地询问它 我正在尝试逐行读取文件 并且我需要将一行特别存储在variable 我已经成功地使用轻松地做到了这一点f