我调用类似getseconddata (list2,n)
输入文件读取
45 P 19
11 S 56
45 S F
30 P F
,功能代码读取
void getseconddata(employeetype list2[], int n)
{
ifstream infile2;
string filename;
int id, changenum;
char stat, changealpha;
cout<<"Enter name of second data file"<<endl;
cin>>filename;
infile2.open(filename.c_str());
infile2>>id;
while (getline(infile2))
{
infile2>>stat;
if (stat=='S')
{
infile2>>changealpha;
}
else if (stat=='P')
{
infile2>>changenum;
}
infile2>>id;
}
infile2.close();
for (int i=0; i<n; i++)
{
cout<<id<<stat<<changealpha<<changenum<<endl;
}
}
输出读取
45 P 19
45 P 19
45 P 19
45 P 19
我尝试过重写代码并在线查找基本功能和eof。帮助
答案 0 :(得分:0)
首先:您对getline
的使用不正确,您的代码应不编译。
while(getline(infile2)) { ... }
infile2
是ifstream
。没有getline
的签名需要ifstream&
。有一个签名需要ifstream
和string
,使用方式如下:
stringstream buffer;
while(getline(infile2, line)) {
buffer << line;
buffer >> id >> stat;
// ...
buffer.clear() // to reset for next iteration
}
第二:您收到的输出是for
循环指示的输出。
for (int i=0; i<n; i++) {
cout << id << stat << changealpha << changenum << endl;
}
这个for
循环,如果您使用getline
是正确的,将输出30 P F
,即最后一行n
次的数据。它不会输出n
list2
的不同索引。原因是您的变量在while
循环的每次迭代时都会重置,并且由于您的for
循环在while
循环后运行,因此只会输出最后一行
第三:您的if-else-if
条件指示输入文件以外的其他内容。
if(stat == 'S') {
infile2 >> changealpha; // 'changealpha' is a 'char'
} else if(stat == 'P') {
infile2 >> changenum; // 'changenum' is an 'int'
}
以上逻辑不符合输入文件的格式:
45 P 19 // 'stat' is P suggests 'int' - correct
11 S 56 // 'stat' is S suggests 'char' - ??? - there are 3 chars after S (' ', '5', '6')?
45 S F // 'stat' is S suggests 'char' - correct
30 P F // 'stat' is P suggests 'int' - ??? - do you want the ASCII char code of 'F'?