我必须从文本文件中加载三个数组作为家庭作业,我无法弄清楚它为什么不起作用。这就是文本文件的样子:
Jean Rousseau
1001 15.50
Steve Woolston
1002 1423.20
Michele Rousseau
1005 52.75
Pete McBride
1007 500.32
这是一行上的名称,然后是下一行以空格分隔的ID号和余额。
这是我导入数据的功能:
void InputFromFile(string fileName, int sizes, string namesAr[],
int idsAr[], float balancesAr[])
{
// Variables
int indexCount;
ifstream inFile;
// Initialize
indexCount = 0;
inFile.open(fileName.c_str());
while(inFile && indexCount < sizes)
{
getline(inFile, namesAr[indexCount]);
inFile >> idsAr[indexCount];
inFile.ignore(1000, '\n');
inFile >> balancesAr[indexCount];
inFile.ignore(1000, '\n');
indexCount++;
}
inFile.close();
}
这是我输出所有项目时添加到数组中的内容......
让·卢梭(Robert Rousseau) 1001 -1
3.76467e-039
36
3.76457e-039
0
6.57115e-039
7736952
8.40779e-045
7736952
0
答案 0 :(得分:7)
inFile >> idsAr[indexCount];
inFile.ignore(1000, '\n');
您从该行读取第一个数字,然后忽略所有字符,直到该行结束,包括第二个数字。然后,您尝试读取下一个名称,就好像它是一个数字一样,并且由于您没有进行任何错误检查,所以一切都会出错。
这个ignore
完全没必要:第一个和第二个数字之间没有什么可以忽略的,因为>>
将跳过任何前导空格。第二个ignore
是,因为在使用getline
读取下一个名称行之前,必须跳过数字行末尾的换行符。您可能更容易仅使用getline
从文件中读取数据,然后使用stringstream
解析数字行。将格式化提取(>>
)与基于行的提取混合起来可能很难正确。
在任何输入操作之后,您必须检查流的状态以确保没有发生错误。举个简单的例子:
if (!(inFile >> idsAr[indexCount]) {
/* input failed; handle error as appropriate */
}
流有许多状态标志,当提取失败时,fail
标志已设置,必须先清除才能继续使用流。