可见问题的关键在于
。
for (int i=0;i<100;i++)
整个100元素数组将被打印出来,无论文件中是否有数据加载到数组中。
可能最简单的方法
是使用std::vector
。它是一个动态大小的数组。当您向其添加内容时,它会变得更大,因此您不必担心它溢出。我们在最后回到它。
接下来,您需要确保成功读取文件。
可以测试流以查看其是否有效。
if (in)
{
cout << "in is good!" << endl;
}
而 >>
运算符返回流的引用,因此您可以
if (in >> data)
{
cout << "data is good!" << endl;
}
如果在读取数据后,流仍然良好,则至少知道文件将某些内容读入数据中,这些内容是正确类型或可以转换为正确类型的。您需要检查读取的值以确保用户没有输错或刻意使程序崩溃。如果您想循环遍历大量内容,例如文件,则最终会得到类似以下的内容:
while (in >> c[i].type >> c[i].selltype >> c[i].price)
如果任何读取操作失败,流在测试时将返回false,并退出循环。
从您的源数据中看,您需要处理空格和逗号。除非您要做很多额外的工作,否则
>>
只能处理空格。您将读取的内容是:
knife,
object,
0
我们不想要逗号。幸运的是,它是最后一个字符,所以处理起来很容易。 C++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 )
如果
i
大于等于 100,则
i < 100
的情况失败,循环退出,甚至不尝试执行
in >> c[i].type >> c[i].selltype >> c[i].price
并写入不存在的数组槽。
记得保留
i
的值,因为数组是愚蠢的。它们不知道自己有多满。
但使用
vector
时,您不需要
i
来计数或跟踪其填充状态,也不需要担心溢出数组,直到将计算机的 RAM 运行完毕。我们只需要一个临时变量来读取,就可以开始了。
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);
}
if (in >> c[i].type >> c[i].selltype >> c[i].price) { 打印内容; } else { 处理错误; }
- user4581301std::getline(in, c[i].type, ',');
然后再加上一些额外的代码来分离空格。 - user4581301std::vector
吗? - user4581301