C++ 将带有分隔符的文本文件读取到结构数组中

2023-12-15

我正在尝试从格式类似于此的文本文件中读取数据:

knife, object, 0
bag, object, 15
kitchen, room, 400

放入由结构体组成的数组中。这是我到目前为止所拥有的,但它只读取第一个元素然后返回垃圾。

#include <iostream>
#include <fstream>
#include <string>


using namespace std;

struct itemlist
{
  string type;
  string selltype;
  int price;
  int diditsell=0;
};

int main()
{
  string filename;
  cout << "Please enter a file name. " << endl;
  cin >> filename;

  ifstream in(filename);
  itemlist c[100];
  for (int i=0;i<100;i++)
  {
      in >> c[i].type >> c[i].selltype >> c[i].price;
      cout << c[i].type << endl;
      cout << c[i].selltype << endl;
      cout << c[i].price << endl;
  }
}

我试图找到特别适合我想做的事情的例子,但实施它们并没有解决问题。任何帮助将不胜感激。


可见问题的症结在于

 for (int i=0;i<100;i++)

无论文件中是否有数据要加载到数组中,都会打印出整个 100 个元素的数组。

可能是最简单的方法是与一个std::vector。它是一个动态大小的数组。当你添加它时,它会变得更大,所以你不必担心它会溢出。我们会在最后再讨论这个问题。

接下来您要做的就是确保成功读取文件。可以测试流以查看它们是否有效.

if (in)
{
    cout << "in is good!" << endl;
}

and the >>运算符返回对流的引用,以便您可以

if (in >> data)
{
    cout << "data is good!" << endl;
}

如果读取数据后流仍然良好,您就知道文件至少将某些内容读取到了正确类型的数据中,或者可以转换为正确的类型。您自己应该在读入后检查读取的值,以确保用户没有输入错误或不遗余力地导致程序崩溃。如果你想循环遍历很多东西,比如文件,你最终会得到这样的结果:

while (in >> c[i].type >> c[i].selltype >> c[i].price)

如果任何读取失败,则测试时流将返回 false,并且循环将退出。

查看您的源数据,您需要处理空格和逗号。>>只知道如何处理空格,除非你要做很多额外的工作。您将读到的是

knife,
object,
0

我们不需要逗号。幸运的是,这是最后一个角色,所以处理它很容易。 AC++11 std::string可以像堆栈一样使用你可以把不需要的字符去掉:

c[i].type.pop_back();
c[i].selltype.pop_back();

总而言之,这给了我们一个看起来像这样的循环

ifstream in(filename);
itemlist c[100];
int i = 0;
while (in >> c[i].type >> c[i].selltype >> c[i].price)
{
    c[i].type.pop_back();
    c[i].selltype.pop_back();
    cout << c[i].type << endl;
    cout << c[i].selltype << endl;
    cout << c[i].price << endl;
    i++;
}

但这可能会超出 100 个元素数组的末尾,因此我们需要更改while稍微循环一下:

while (i < 100 && in >> c[i].type >> c[i].selltype >> c[i].price )

If i大于或等于 100,则i < 100case 失败并且循环退出,甚至没有尝试in >> c[i].type >> c[i].selltype >> c[i].price并写入不存在的数组槽。

请记住保留以下值i因为数组很愚蠢。他们不知道自己有多饱。

但随着vector你不需要i来计数或跟踪它有多满,并且在您的计算机运行内存不足之前,您无需担心数组溢出。我们真正需要的是一个要读入的临时变量,然后我们就可以开始了。

vector<itemlist> c;
itemlist temp;
while (in >> temp.type >> temp.selltype >> temp.price)
{
    temp.type.pop_back();
    temp.selltype.pop_back();
    cout << temp.type << endl;
    cout << temp.selltype << endl;
    cout << temp.price << endl;
    c.push_back(temp);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 将带有分隔符的文本文件读取到结构数组中 的相关文章

  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 如何使用applescript以编程方式获取最新下载的文件名?

    我需要在 Mac 上以编程方式获取文件名 我使用 Selenium 下载文件 并从下载文件夹中选择相同的文件以编程方式安装 我使用 Applescript 执行相同的操作 我被困在运行时获取文件名 而且我的下载页面 url 不包含下载文件的
  • dart FFI 中“char*”的“本机类型”是什么?

    我有一个这样的功能C语言 char getString return SOME STRING 现在我想通过调用它FFI in dart 这是我的代码 import dart io import dart ffi void main List
  • 为什么Java接口可以在这些代码中实例化呢? [复制]

    这个问题在这里已经有答案了 可能的重复 创建接口的 对象 我是 Java 新手 根据我的理解 我们无法实例化一个Interface 我们只能实例化一个class它实现了一个interface The new关键字用于从类创建对象 但是 当我
  • SceneKit:内存过多

    我已经没有想法了 SceneKit 正在堆积内存 而我才刚刚开始 我正在显示SNCNodes它们存储在数组中 这样我就可以分离分子的组成部分以进行动画 这些树模型分子我最终可能会展示 50 个 比如说每 章 一个 问题是 当我转到另一章时
  • 与“PropTypes.element”相对应的“defaultProp”的正确值是什么?

    我有一个组件 我希望接受另一个组件作为道具 并渲染它 我希望传递的组件是可选的 并且在这种情况下不渲染任何内容 下面的代码可以完美运行 const Component Inner gt div div
  • 有没有办法生成单元测试来测试我的语法

    我使用 antlr4 创建了语法 但我想测试稳健性有没有自动工具或快速完成此操作的好方法 谢谢 由于很难找到 ANTLR 的真正单元测试 我写了两篇关于它的文章 Lexer 的单元测试 解析器的单元测试 A 词法分析测试检查给定文本是否被读
  • 如何使 ImageButtons 边界环绕图像?

    我正在为 Android 应用程序制作 GUI 该 GUI 包含四个方向ImageButtons 看下图 但是当试图做到这一点时总是失败 因为为每个图像保留了一个正方形 这就是我所达到的 那是我的XML code
  • 我现在可以将使用 WatchKit 的应用程序上传到 App Store 吗?

    我制作了一个应用程序 包括一个iOS应用程序和一个WatchKit应用程序 每个部分都可以独立运行 我现在可以将此应用程序上传到 App Store 以便在发布时可以在 Apple Watch 上使用吗 还是必须等待 如果答案是肯定的 我是
  • 如何将 CreateObject("Wscript.shell") 转换为 C# [重复]

    这个问题在这里已经有答案了 我怎样才能用 C 翻译这个 Set WshShell WScript CreateObject WScript Shell 谢谢 这个用在什么场合呢 还有我必须在 C 中包含什么库才能工作 使用用于脚本编写的 S
  • 如何在 iPhone 的图像上添加文字?

    我需要在 iPhone 中将文本放在图像上 它就像 Eurosport iPhone 应用程序 source mzstatic com 以同样的方式 我需要在我的应用程序中添加文本 我怎样才能做到这一点 Thanks 我找到了两种方法 1
  • 我可以使用 WinApi Deploy Cmd 在电脑上安装、更新吗

    我的 appx 文件安装在文件夹中 我可以通过双击该文件来安装它 但我正在寻找一种使用 WinAppDeployCmd 进行安装和更新过程来安装它的方法 WinAppDeployCmd install file C release file
  • Hadoop:JPS 找不到已安装的 Java

    我的配置是 hduser worker1 usr local hadoop conf jps The program jps can be found in the following packages openjdk 6 jdk open
  • 如何使用外部 JSON...?

    花了几个小时试图解决这个问题 但我无法弄清楚出了什么问题 我想做的就是加载这个 https recruit zoho com ats EmbedResult hr jodigest 2cV Sr2As6VxhLMxQGuTNij g Fb3
  • 通过 cron 执行的 Google Cloud SDK 代码

    我正在尝试实现一个自动代码来通过 Crontab 关闭和启动我的 Google Cloud 帐户中的 VM 实例 操作系统是 Ubuntu 12 lts 并安装了 Google 服务帐户 因此它可以处理我的 Google 云帐户上的读 写
  • 如何使用tensorflow进行文本分类?

    我是张量流和机器学习的新手 我在编写张量流代码时遇到问题 该代码的文本分类类似于我尝试使用 sklearn 库进行的文本分类 我在对数据集进行矢量化并向张量流层提供输入方面面临着重大问题 我确实记得对标签进行了一次热编码 但前面的张量流层不
  • Twitter 模块 python 'module' 对象没有属性 Oauth

    我正在尝试遵循这个基本示例here Code import twitter XXX Go to http dev twitter com apps new to create an app and get values for these
  • 随机化神经网络输入顺序的影响

    在我的高级算法和数据结构课程中 我的教授要求我们选择任何我们感兴趣的主题 他还告诉我们要研究它并尝试实施解决方案 我选择神经网络是因为它是我长期以来想学习的东西 我已经能够使用神经网络实现 AND OR 和 XOR 该神经网络的神经元使用阶
  • 共享变量的过时值

    在阅读实践中的并发性时 我读到 NoVisibility展示了一种不充分的方法 同步程序可能会导致令人惊讶的结果 陈旧的数据 当 的时候 读者线程检查ready 它可能会看到一个过时的值 除非 每次访问变量时都会使用同步 这是 可能会看到该
  • 分离数据框列中的值并融化

    我有一个数据框 我想在其中分隔 Client ID 列中的值并融化 因此每一行都包含一个 Client ID 以及相应的 Account Name 和所有者 gt head df Account Owner Account Name Cli
  • C++ 将带有分隔符的文本文件读取到结构数组中

    我正在尝试从格式类似于此的文本文件中读取数据 knife object 0 bag object 15 kitchen room 400 放入由结构体组成的数组中 这是我到目前为止所拥有的 但它只读取第一个元素然后返回垃圾 include