使用 fgets 和 strtok 从文件中读取和解析行

2023-12-01

我在编写相当基本的代码时遇到了麻烦。我需要从下面所示的文件中读取每一行,用 strtok 将其分成 3 部分,并将每个部分存储到一个数组中。 “目标”和“助攻”的数组工作正常,但由于某种原因,整个名称数组都填充了从文件中读取的姓氏。

输入文件:

Redden 2 0
Berglund 5 2
Jackman 2 0
Stewart 4 0
Oshie 3 5
McDonald 2 4
Pietrangelo 2 7
Perron 2 6
Tarasenko 5 5

相关代码:

int main(int argc, char* argv){  
    FILE* inFile = fopen(argv[1],"r");
    char ** nameArray;
    int * goalArray;
    int * assistArray;
    int size = countLinesInFile(inFile);
    allocateMemory(&goalArray, &assistArray, &nameArray, size);
    readLinesFromFile(inFile, goalArray, assistArray, nameArray, size);
}

void allocateMemory(int** goals, int** assists, char*** names, int size)
{
  *goals = malloc(size*sizeof(int));
  *assists = malloc(size*sizeof(int));
  *names = malloc(size*sizeof(char *));
  int i;
  for(i=0; i<size; i++)
  {
    *(*names + i) = calloc(MAX_NAME,sizeof(char));
  }
}

void readLinesFromFile(FILE* fPtr, int* goals, int* assists, char** names, int numLines)
{
  int i;
  char * buffer = malloc(MAX_LINE*sizeof(char));
  for(i = 0; i<numLines; i++)
  {
    if(fgets(buffer, MAX_LINE, fPtr)!= NULL)
    {
      names[i] = strtok(buffer, " \n");
      goals[i] = atoi(strtok(NULL, " \n"));
      assists[i] = atoi(strtok(NULL, " \n"));
    }
  }
}

由于某种原因,nameArray[0-9] 都包含“Tarasenko”,对此的任何帮助将不胜感激。


strtok返回一个指向包含下一个标记的以 null 结尾的字符串的指针。要实际复制此令牌,您应该使用strcpy:

strcpy(names[i],    strtok(buffer,      " \n"));
strcpy(goals[i],    atoi(strtok(NULL,   " \n")));
strcpy(assists[i],  atoi(strtok(NULL,   " \n")));

另请注意,您的代码中存在内存泄漏:

void readLinesFromFile(/*...*/)
{
    char * buffer = malloc(MAX_LINE*sizeof(char));
    // ...
    fgets(buffer, MAX_LINE, fPtr);
    // ...
}

您动态分配buffer通过致电malloc,但您没有释放该内存。别忘了打电话free()指向已分配内存的指针malloc。但在这种情况下,具有自动存储持续时间的数组将是更好的选择:

void readLinesFromFile(/*...*/)
{
    char buffer[MAX_LINE];
    // ...
    fgets(&buffer, MAX_LINE, fPtr);
    // ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 fgets 和 strtok 从文件中读取和解析行 的相关文章

随机推荐

  • 将 X.509 证书从十六进制形式转换为 .cer 格式

    如何将 X 509 证书从十六进制转储形式转换为 CER 格式 此外 是否应该首先从十六进制转储中删除空格分隔符 谢谢 你可以使用ASN 1 编辑器 它有一个数据转换器 可以将 HEX 格式的数据转换为 PEM 格式的数据 源代码也可用 因
  • C# 解密加密文件时出现“Bad Data”异常

    嘿 我对加密和解密很陌生 说实话 甚至对 C 语言也很陌生 基本上 我有一个 TCP 聊天服务器 可以 保存 日志并加密文本文件 这就是我加密的方式 基于 MSDN 示例 public static void EncryptFile str
  • 使用mechanize登录megaupload

    我正在尝试使用以下代码登录megaupload 我的问题是 如何才能成功登录 我在代码末尾打印出当前的 URL 但是当我运行脚本时 它只返回 www megaupload com import mechanize import cookie
  • 检索和使用 tkinter 组合框选择

    我正在为一个定制计算器组装一个 GUI 它可以自动将某些测量单位转换为其他测量单位 我想返回所选的实际文本 以便我可以根据用户选择的任何内容编写 if 语句 如何让 python 返回实际值而不是我现在得到的值 每当我测试此代码时 我都会收
  • 为什么 AES 的不同实现会产生不同的输出?

    我觉得我对哈希函数及其所涉及的契约有很好的理解 输入 X 上的 SHA1 将始终产生相同的输出 您可以使用 Python 库 Java 库或笔和纸 它是一个函数 它是确定性的 我的 SHA1 与你的 Alice 和 Bob 的相同 据我了解
  • Oracle返回count的最高值

    为清楚起见进行了编辑 因此 我使用 Oracle SQL Developer 并设置了相当基本的数据库 我正在尝试计算两个合并列的重复项总数 并返回数量最高的字段 我使用的是 Oracle IDE 19 2 1 这是我到目前为止所拥有的 s
  • Azure DevOps Nuget 管道步骤中的 Nuget 包描述

    是否可以为 Azure DevOps Pipeline 中添加的 NuGet 包添加描述 Azure DevOps Nuget 管道步骤中的 Nuget 包描述 众所周知 当我们打包 nuget 包时 csproj文件 nuget将从文件中
  • 对于 Marshmallow 或更高版本中的窗口类型 2010,Android 权限被拒绝

    我正在尝试做Chathead类型过度绘制通过安卓服务在我的应用程序上 如下图所示 这个聊天头应用程序适用于 Android 版本 5 或更低版本 kitkat 棒棒糖等 但我在 Marshmallow 和更高版本中尝试它 然后收到此错误 a
  • 绘制图形在 VB.net 中消失

    我有一个简单的程序 您可以使用 FillEllipse 和 FillRectangle 在屏幕上绘制 我的问题是 当您将另一个窗口拖动到屏幕的一小部分时 该部分将被删除 当您将另一个窗口拖过 放开 然后将其拖回时 就会发生这种情况 有没有什
  • 在 Python 中使用 rarfile 从 RAR 存档中提取单个文件

    我有一个包含 2 个文件的 RAR 存档 但我只想提取一个 我在另一个答案中发现我可以使用rarfile包 根据文档包含extract功能 但是 当我尝试运行脚本时 我得到了FileNotFoundError WinError 2 以及以下
  • 在脚本中使用电子表格标准函数?

    当我编写脚本并想要使用标准函数时 例如WEEKNUM 这是否可以直接进行 或者我是否必须通过以下方式将公式触发到另一个字段 setFormula formula 然后读取相关单元格的内容 您描述的方法确实可行 但根本效率不高 因为它需要多次
  • 如何使用scikit线性回归模型同时求解多个独立时间序列

    我尝试使用 sklearn 线性回归模型同时预测多个独立时间序列 但我似乎无法正确预测 我的数据组织如下 Xn是一个矩阵 其中每行包含 4 个观测值的预测窗口 yn是每行的目标值Xn import numpy as np training
  • 登录 google firebase 帐户时出现错误 16 问题

    如您所见 这是我的代码 主要是从谷歌文档复制的 用于谷歌登录身份验证 问题是 当我单击登录按钮时 它会抛出一个名为 16 的错误 抱歉发布图像 我在发布代码时遇到问题 希望有人可以帮助我解决此问题 依赖关系 对于火力基地 implement
  • 收到“阅读器关闭时调用 Read 的尝试无效”

    我有以下代码 此处使用伪值以提高可读性 其中第一个连接返回大量数据 数千行 SqlDataReader 通过以下方式一一读取它们reader Read 然后打开一个新连接以使用新值更新每一行 using SqlConnection conn
  • 如何在 VB.NET 窗体的默认实例中调用方法而不是实例化另一个方法?

    当实例化的类调用父表单类中的方法时 VB NET 启动表单类的一个新实例 而不是调用活动实例的方法 我如何告诉它我只有一个表单类的实例 或者我不想创建表单的新实例而只想调用已经处于活动状态的表单上的方法 这是使用线程时的一个经典问题 表单实
  • 反序列化派生类时如何忽略基类 JsonConverter?

    我有一个抽象基类 JsonConverter typeof Converter public abstract class TextComponent public bool Bold get set public TextComponen
  • 如何在WPF中使用调度程序定时器精确控制帧速率?

    当我尝试使用 System Windows Threading DispatcherTimer 实例控制 WPF 中的帧速率时遇到问题 为了尝试 DispatcherTimer 的有效性 我创建了一个简单的 WPF 演示 其中包含一个窗口
  • Mysql 按 24 小时间隔分组

    如何按时间间隔对表 Test 的记录进行分组 每天从 19 00 开始 到第二天 18 59 结束 表 测试 id creation date name 1 2014 01 01 17 52 27 a 2 2014 01 01 18 50
  • CodeIgniter 2.x 中的数据库驱动路由

    我正在创建一个站点 该站点将有很多需要添加到路由文件中的路由 800 显然我不想将这些路由一一手动添加到路由配置文件中 任何人都可以建议最佳实践 让我的路线自动从数据库加载 是否有合适的库 帮助程序可以执行此任务 适用于 2 x 版本 例如
  • 使用 fgets 和 strtok 从文件中读取和解析行

    我在编写相当基本的代码时遇到了麻烦 我需要从下面所示的文件中读取每一行 用 strtok 将其分成 3 部分 并将每个部分存储到一个数组中 目标 和 助攻 的数组工作正常 但由于某种原因 整个名称数组都填充了从文件中读取的姓氏 输入文件 R