将这行文本读入结构的最简单方法?

2023-12-06

我有一个文本文件,其中的数据格式如下:

Lee AUS 2 103 2 62 TRUE
Check AUS 4 48 0 23 FALSE
Mills AUS 8 236 0 69 FALSE

我需要将每一行放入一个结构中,但是我想避免使用固定长度数组(据我所知,fgets 存在问题):

struct Data
{
    char *sname;
    char *country;
    int *a;
    int *b;
    int *c;
    int *d;
    char *hsisno;
};

我对 C 很陌生。我应该使用 fscanf 还是 fgets?


fscanf代表“文件扫描格式化的“并且用户数据大约为未格式化的正如你所能得到的。

你永远不应该使用赤裸裸的"%s"格式化数据上的字符串,您无法绝对控制可以读取的内容。

最好的解决方案是使用fgets读取一行,因为这可以防止缓冲区溢出。

然后,一旦您知道了行的大小,这就是您需要的每个字符串的最大大小。使用sscanf随心所欲地获得实际的字段。

最后一件事。可能有点浪费int*整数的类型,因为您知道它们已经具有特定的最大大小。我会使用非指针变体,例如:

struct Data {
    char *sname; char *country;
    int a; int b; int c; int d;
    char *hsisno;
};

作为示例,这里有一些安全代码:

#include <stdio.h>
#include <string.h>

// Here's all the stuff for a linked list of your nodes.

typedef struct sData {
    char *sname; char *country; char *hsisno;
    int a; int b; int c; int d;
    struct sData *next;
} Data;
Data *first = NULL; Data *last = NULL;

#define MAXSZ 100
int main (void) {
    char line[MAXSZ], sname[MAXSZ], country[MAXSZ], hsisno[MAXSZ];
    int a, b, c, d;
    FILE *fIn;
    Data *node;

    // Open the input file.

    fIn = fopen ("file.in", "r");
    if (fIn == NULL) {
        printf ("Cannot open file\n");
        return 1;
    }

    // Process every line.

    while (fgets (line, sizeof(line), fIn) != NULL) {
        // Check line for various problems (too short, too long).

        if (line[0] == '\0') {
            printf ("Line too short\n");
            return 1;
        }

        if (line[strlen (line)-1] != '\n') {
            printf ("Line starting with '%s' is too long\n", line);
            return 1;
        }

        line[strlen (line)-1] = '\0';

        // Scan the individual fields.

        if (sscanf (line, "%s %s %d %d %d %d %s",
            sname, country, &a, &b, &c, &d, hsisno) != 7)
        {
            printf ("Line '%s' didn't scan properly\n", line);
            return 1;
        }

        // Allocate a new node to hold data.

        node = malloc (sizeof (Data));
        if (node == NULL) {
            printf ("Ran out of memory\n");
            return 1;
        }

        node->sname = strdup (sname);
        node->country = strdup (country);
        node->a = a;
        node->b = b;
        node->c = c;
        node->d = d;
        node->hsisno = strdup (hsisno);
        node->next = NULL;
        if (first != NULL) {
            last->next = node;
            last = node;
        } else {
            first = node;
            last = node;
        }
    }

    fclose (fIn);

    // Output the list for debugging.

    node = first;
    while (node != NULL) {
        printf ("'%s' '%s' %d %d %d %d '%s'\n",
            node->sname, node->country, node->a, node->b,
            node->c, node->d, node->hsisno);
        node = node->next;
    }

    return 0;
}

它读取您的文件并将其存储在链接列表中。它输出:

'Lee' 'AUS' 2 103 2 62 'TRUE'
'Check' 'AUS' 4 48 0 23 'FALSE'
'Mills' 'AUS' 8 236 0 69 'FALSE'

最后,正如预期的那样。


我已经就使用的陷阱做了一系列的回答*scanf非受控数据上的函数(输入user:14860 fgets进入上面的搜索框),其中一些(here, here and here,例如)包括我一直以来最喜欢的功能,getLine,为了更安全的用户输入。

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

将这行文本读入结构的最简单方法? 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi

随机推荐

  • 当我的闪屏启动时出现 java.lang.UnsupportedOperationException

    当我的启动屏幕启动时 我在 logcat 中收到错误 11 06 02 36 45 450 E global 4184 Deprecated Thread methods are not supported 11 06 02 36 45 4
  • 简单的 Android 应用程序 - 在智能手机上运行时出现内存不足错误

    我对 Android Studio 相当陌生 我尝试制作一个简单的应用程序 单击按钮后应出现随机图像 下一个不可能是已经展示过的 我有两节课 MainActivity 和 RandomCardDraw 当我在 AVD 模拟器中运行该应用程序
  • JFreechart极坐标图形状注释

    我正在尝试用不同的颜色为极坐标图的不同区域着色 例如 为角度 20 和 60 之间以及半径 2 和 4 之间的区域着色 我怎样才能做到这一点 我正在考虑使用形状注释并从那里绘制弧线 但似乎极坐标图没有形状注释 有任何想法吗 谢谢 impor
  • PHP:最佳配置存储?

    我的应用程序通过大量键 值进行配置 例如 30 000 个 我想找到这些配置的最佳部署方法 因为我知道我想避免 DEFINE 以允许运行时重新配置 我想过 通过 php 文件将它们预编译成数组 将它们预编译到 tmpfs sqlite 数据
  • Access-Control-Allow-Origin 错误但请求通过

    我目前正在将一个基本 API 部署到我的实时服务器上 并且遇到了 我认为是 CORS 问题 但发生了一些我无法解释的行为 我正在从 AngularJS 前端与 Laravel 5 laravel cors 后端 我开始使用简单的 jQuer
  • 如何获取 Silverlight 应用程序中的客户端大小?

    我想获取运行 Silverlight 应用程序的浏览器窗口的大小 我尝试过以下几行 但它总是返回零 public Page InitializeComponent Initialize public void Initialize Worl
  • 删除前的模型回调

    我试图在使用级联模型删除这些图像的容器时删除图像 delete 级联工作正常 但我无法在删除后回调模型以正常工作 因此我可以在删除时删除实际的图像文件 function beforeDelete containerId this gt id
  • 开发一套依赖 R 包的最佳实践

    我开始研究一系列 R 包 所有这些包都共享大量公共代码 这些代码位于自己的包中 我们称之为myPackageUtilities 所以我有几个包 myPackage1 myPackage2 etc 所有这些包都依赖于中的每个方法myPacka
  • 过滤 pandas 中的数据框

    我有一个数据框如下 dic wteam 2 3 4 2 4 lteam 3 4 2 4 2 pd DataFrame dic lteam wteam 0 3 2 1 4 3 2 2 4 3 4 2 4 3 4 我需要一个新的数据框 其中有
  • 使用 write.table 将结果附加到 R 中的现有文件

    我对 R 中的文件进行了文本挖掘 然后将其作为新列附加到现有文件中 完成后 该列将添加到实际内容之后 我该如何纠正这个问题 结果如下 Customer Names T MAX INDUSTRIAL LTD T MAX INDUSTRIAL
  • 如何从 Powershell 运行此 Beyond Compare 脚本?

    目前我可以使用 Beyond Compare 脚本将结果输出到文件 你们都能够帮助我弄清楚如何通过 Powershell 检查结果文本文件中的差异 不过 我还有一个问题 为了将结果保存到文本文件中 Beyond Compare 让您使用基本
  • 如何在 Selenium (selenium-webdriver) JavaScript 中使用 Chrome 配置文件

    由于似乎没有办法使用现有的 Chrome 窗口 我如何在该窗口中使用用户的 Google 帐户 以及所有设置和密码 Selenium opens Selenium似乎为自己打开了窗口 但没有谷歌帐户 这是我的程序的重要组成部分 我的程序对时
  • 使用asyncio在django中执行周期性任务

    你认为可以使用asyncio在django中每n秒运行一个任务 这样主进程就不会被阻塞吗 例如 每 5 分钟在控制台中打印一次 例如 import asyncio from random import randint async def d
  • Altair:更改滑块的位置

    是否可以更改滑块选择绑定的位置 在 Altair 文档或 vega lite 文档中找不到某些内容 https vega github io vega lite docs bind html 我想将年份滑块向上移动 靠近主散点图 https
  • 如何在Databricks上重新安装相同版本的wheel而不重新启动集群

    我正在开发一些Python代码 这些代码将用作各种的入口点轮式工作流程在数据块上 鉴于它正在开发中 在我更改代码来测试它之后 我需要构建一个轮子并部署在 Databricks 集群上来运行它 我使用了一些仅在 Databricks 运行时中
  • Bigquery - 向每个 ID 添加完整日期范围

    我如何将 GENERATE DATE ARRAY start date end date INTERVAL INT64 expr date part 应用于数据集中的每个记录 我了解如何应用它来获取从开始到结束的单个日期范围 但不知道如何将
  • 使用 setState 仅更新多维数组的一个元素

    我只想更改多维数组的一个元素 nodes is a 2 dimensional array of 30 rows and 30 columns this state nodes updatedNodes is a deep copy of
  • 预处理器指令在 C 中如何工作?

    我正在阅读一本书 让我们 C by Yashwant Kanetkar 其中写道 当我们编译程序时 在源代码传递给编译器之前 C 预处理器会检查源代码是否有宏定义 当它看到 define指令时 它会遍历整个程序来搜索宏模板 无论它找到什么
  • 从节点模块导入 axios 时出现错误

    我已经通过 npm 安装了 axios 并尝试将 axios 导入到我的前端脚本文件中 我面临的错误是 未捕获的语法错误 无法在模块外部使用 import 语句 这是我的 app js 文件 import axios from axios
  • 将这行文本读入结构的最简单方法?

    我有一个文本文件 其中的数据格式如下 Lee AUS 2 103 2 62 TRUE Check AUS 4 48 0 23 FALSE Mills AUS 8 236 0 69 FALSE 我需要将每一行放入一个结构中 但是我想避免使用固