可见问题的症结在于
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 < 100
case 失败并且循环退出,甚至没有尝试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);
}