gpt4 book ai didi

c++ - 尝试将文本文件读入 C++ 中的结构数组

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:22 25 4
gpt4 key购买 nike

首先,我使用的是 DEVC++,这段代码的目标是能够将文本文件读入结构数组。我的文本文件是这样写的:animalName:animalType:RegistrationNo:ProblemNo.

我对以下代码的问题是它似乎只运行一次 while 循环。

我查找了类似的代码,但它使用了 to_string() 和 stoi,但我不认为 DEVC++ 运行 C++11,所以我想知道是否可以轻松修复我现有的代码,或者是否有其他方法来完成读取由字符串和整数组成的文本文件

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#define MAX 100
using namespace std;

struct Animal
{
string animalName;
string animalType;
int Registration;
int Problem;
};

int main()
{
Animal ani[MAX];
ifstream infile;
int i = 0;

infile.open("Animals.txt");
if (!infile) {
cout << "Unable to open file";
exit(1);
}

int count = 0;
while (infile.good()) {
getline(infile, ani[i].animalName, ':');
getline(infile, ani[i].animalType, ':');
infile >> ani[i].Registration, ':';
infile >> ani[i].Problem, '.';

count++;
i++;
}

infile.close();
for (int i = 0; i < count; i++) {
cout << ani[i].animalName << " ";
}
for (int i = 0; i < count; i++) {
cout << ani[i].animalType << " ";
}
for (int i = 0; i < count; i++) {
cout << ani[i].Registration << " ";
}
for (int i = 0; i < count; i++) {
cout << ani[i].Problem<< " ";
}

return 0;
}

最佳答案

您滥用了 comma operator .

infile >> ani[i].Registration, ':';` 

不读取并丢弃 ':',导致血腥死亡......抱歉。

时导致解析错误
infile >> ani[i].Problem

尝试将 ':' 转换为整数。这会将 infile 置于失败状态,

while (infile.good())

发现infile不好,退出循环。

你必须按照

std::string temp;
std::getline(infile, temp, ':');
ani[i].Registration = std::stoi(temp);

':' 分隔符之前的流读取到 std::string 中,然后将 string 转换为整数std::stoi.

Documentation on std::stoi

这就是错误的主要部分。但是……

while (infile.good())

在读取流之前测试流是否良好。这允许流在读取时完全失败,而无需在使用失败结果之前进行任何测试。

while (getline(infile, ani[i].animalName, ':') &&
getline(infile, ani[i].animalType, ':') &&
getline(infile, temp1, ':') &&
getline(infile, temp2, '.'))
{ // only goes into loop if everything was read
// may also have to eliminate a newline here
ani[i].Registration = std::stoi(temp1);
ani[i].Problem = std::stoi(temp2); //exception if bad
i++;
}

更好的方法是为 Animal 重载 >> 运算符,因为这样您就可以编写如下所示的主循环

while (infile>> ani[i])
{
i++;
}

这很简单,让所有人都为之欢欣鼓舞。参见 What are the basic rules and idioms for operator overloading?有关编写 >>> 运算符的信息以及更多一般知识。

关于c++ - 尝试将文本文件读入 C++ 中的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55466803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com