当我运行这个程序时,循环执行它想要做的事情,但它也会以某种不寻常的方式出于某种原因终止程序。这有什么不对?
这是它打开的数据文件:
Peter Y Y N Y Y N
Sarah Y Y Y Y Y Y
Bongi Y Y Y N N N
Diane Y N Y N Y Y
Betty N Y Y Y Y N
代码:
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
ifstream in_stream;
in_stream.open("answers.dat");
if (in_stream.fail())
{
cout<<"Input file opening failed"<<endl;
exit(1);
}
string line;
int q1,q2,q3,q4,q5,q6;
int prize_money;
int loop=0;
string array[20];
while (!in_stream.eof())
{
getline(in_stream,line);
array[loop]=line;
if ((line.compare(10,1,"Y")==0)&&(line.compare(14,1,"Y")==0))
{
if (line.compare(6,1,"Y")==0)
{
q1=1000;
}
else
{
q1=0;
}
if (line.compare(8,1,"Y")==0)
{
q2=2000;
}
else
{
q2=0;
}
if (line.compare(10,1,"Y")==0)
{
q3=3000;
}
else
{
q3=0;
}
if (line.compare(12,1,"Y")==0)
{
q4=4000;
}
else
{
q4=0;
}
if (line.compare(14,1,"Y")==0)
{
q5=5000;
}
else
{
q5=0;
}
if (line.compare(16,1,"Y")==0)
{
q6=6000;
}
else
{
q6=0;
}
prize_money=q1+q2+q3+q4+q5+q6;
cout<<line.substr(0,5)<<" R"<<prize_money<<endl;
}
loop++;
}
cout<<"Test to see if program goes beyond the loop"<<endl;
in_stream.close();
return 0;
}
当我运行程序时,它会正确显示获胜者和金额,但会出现一个窗口对话框,收集更多信息并想要关闭程序。一旦我关闭它,屏幕上显示的消息是:
在'std :: out_of_range'的实例后调用terminate():basic_string :: compare这个程序已经请求Runtime以一种不寻常的方式终止。有关更多信息,请联系应用程序支持团队
答案 0 :(得分:1)
如果它读取的最后一行为空,并且您尝试读取该行的字符10,则它将失败。在测试其中的字符之前,您应该检查行的长度。
此外,无论谁指示你使用std::istream::eof
作为循环控制是如何做到这一点,你可以告诉他们除了最薄弱的环境之外他们都是错的,没有一个在你发布的代码中展示。 See this question and answers了解有关原因的更多信息。
最后,你很幸运没有一个名叫“John”,“William”,“Jane”或“Annabelle”的人都记录了数据。你的算法非常脆弱,依赖于名称的长度来保持严格的常数,不超过五个字符。
我认为这样的事情会更符合应该做的事情:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib>
int main()
{
std::ifstream in_stream("answers.dat");
if (in_stream.fail())
{
std::cerr << "Input file opening failed\n";
exit(EXIT_FAILURE);
}
std::string line;
while (std::getline(in_stream, line))
{
std::istringstream iss(line);
std::string name;
if (iss >> name)
{
static const int prize[] = { 1000, 2000, 3000, 4000, 5000, 6000 };
static const size_t n_prizes = sizeof prize / sizeof *prize;
int prize_money = 0;
std::string yesno;
for (size_t i=0; i<n_prizes && iss >> yesno; ++i)
{
if (yesno == "Y")
prize_money += prize[i];
}
std::cout << name << " R" << prize_money << '\n';
}
}
return EXIT_SUCCESS;
}
无论如何都是这样的。
答案 1 :(得分:0)
#include<iostream
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<iomanip>
using namespace std;
int main()
{ifstream in_stream;
in_stream.open("answers.dat");
if (in_stream.fail())
{cout<<"Input file opening failed"<<endl;
exit(1);}
string line;
int q1,q2,q3,q4,q5,q6;
int prize_money;
int loop=0;
string array[18];
while (getline(in_stream,line))
{array[loop]=line;
if ((line.compare(10,1,"Y")==0)&&(line.compare(14,1,"Y")==0))
{ if (line.compare(6,1,"Y")==0)
{q1=1000;}
else {q1=0;}
if (line.compare(8,1,"Y")==0)
{q2=2000;}
else {q2=0;}
if (line.compare(10,1,"Y")==0)
{q3=3000;}
else {q3=0;}
if (line.compare(12,1,"Y")==0)
{q4=4000;}
else {q4=0;}
if (line.compare(14,1,"Y")==0)
{q5=5000;}
else {q5=0;}
if (line.compare(16,1,"Y")==0)
{q6=6000;}
else {q6=0;}
prize_money=q1+q2+q3+q4+q5+q6;
cout<<line.substr(0,5)<<" R"<<prize_money<<endl;
}
loop++;}
cout<<"Test to see if program goes beyond the loop"<<endl;//indeed it does
in_stream.close();
return 0;
}