所以,我的c ++代码存在一些问题。我有以下代码,但到目前为止,我无法将大部分数据存储到结构化数据类型中。
cout << setprecision(2) << fixed << showpoint;
ofstream salesFile ("Sales.txt");
ifstream stockFile ("Stock.txt");
for (counter = 0; counter < 9; counter++)
{
stockFile >> instock[counter].itemCode;
stockFile.getline (instock[counter].description, 20);
stockFile >> instock[counter].price;
}
然后get代码看起来像这样。
<button type="button" class="button" onclick="comboChart()">Combo Chart</button>
输出应该看起来像:
1234“这里的描述”999.99 数量X
这就是输出:
1234 0.00 数量5
答案 0 :(得分:1)
如果您的文件格式为(一个条目)
1234
description here
999.99
(跨多行)然后解释很简单
读取循环中的代码,
stockFile >> instock[counter].itemCode;
stockFile.getline (instock[counter].description, 20);
stockFile >> instock[counter].price;
将按此顺序工作
instock[counter].itemCode
的值将获得值1234
。但是(理解这一点很重要) 1234
之后的换行符仍然会在流中等待读取。getline()
的来电将遇到换行符,并立即返回。 instock[counter].description
将包含字符串""
。stockFile >> instock[counter].price
将在说明中遇到d
。这不能解释为整数值,因此instock[counter].price
将保持不变。假设某些前面的代码(您尚未显示)将instock[counter].price
设置为999.99
,则上述事件序列将解释您的输出。
真正的问题是你在一个流上混合输入样式。在这种情况下,将流操作符>>
的使用与使用面向行的输入(getline()
)混合使用。根据我对上述序列的描述,不同的输入样式以不同的方式交互,因为(在这种情况下)它们在遇到换行符时表现不同。
有些人会在阅读instock[counter].itemCode
后告诉您跳过换行符。这个建议是有缺陷的,因为它不能很好地应对变化(例如,如果文件格式改变为在另一条线上包含一个额外的字段会发生什么?如果文件不是&#34;那么会发生什么? #34;出于某种原因的预期格式?)。
更通用的解决方案是避免在一个流上混合输入样式。一种常见的方法是使用getline()
来读取流中的所有数据(即不使用>>
直接与stockFile
进行交互)。然后解释/解析每个字符串以找到所需的信息。
顺便说一句,不是使用char
数组来保存字符串,而是尝试使用标准std::string
(来自标准标题<string>
)。这具有以下优点:std::string
可以根据需要调整其长度。 std::getline()
也有一个可以愉快地读到std::string
的重载。一旦数据从您的流中读取为std::string
,就可以根据需要对其进行解释。
解释字符串的方法有很多种(例如从中提取整数值)。作为一项练习,我会为此找到一种方法 - 您将通过自己动手学习更多知识。