我想解决以下任务:
给出了一个文本文件“pesel.txt”,其中包含150个国家身份。每行包含一个国家身份,这是一个11位数字。左边的前两位数确定一个人出生的年份,接下来的两位数确定月份,接下来的两位数确定日期。
缩短:
数字0-1 =年份 数字2-3 =月 数字4-5 =天 数字6-11 =确定别的东西,这里不重要的是什么
我需要阅读该文件,检查12月份出生的人数。我正在尝试以下方式:
以下是代码:
int _tmain(int argc, _TCHAR* argv[])
{
ifstream file( "C:\\Kuba\\Studia & Nauka\\MATURA XDDD
\\INFA\\1\\Dane_PR\\pesel.txt" );
string line;
int bornInDecember=0;
if( !file.is_open() ){
cout << "Cannot read the file." << endl ;
}else{
while( file.good() ){
getline( file, line );
if( line[2] == '1' && line[3] == '2' ){
bornInDecember++ ; // 0-1 year, 2-3 month, 4-5 day
}
}
cout << "Amount of people born in december : "<< bornInDecember<< endl;
file.close();
}
system("pause");
return 0;
}
问题是我收到以下错误,我不知道为什么......
答案 0 :(得分:2)
while file.good()
错误 - getline
仍会失败。您阅读文件的最后一行,处理它,file.good()
仍然是,然后您尝试再读一行,getline
失败。
在访问line[n]
之前,您还需要检查该行是否足够长 - 或者您将得到确切的错误。
int _tmain(int argc, _TCHAR* argv[])
{
ifstream file( "C:\\Kuba\\Studia & Nauka\\MATURA XDDD\\INFA\\1\\Dane_PR\\pesel.txt" );
string line;
int bornInDecember=0;
if( !file.is_open() ){
cout << "Cannot read the file." << endl ;
} else {
while (getline(file, line)) { // While we did read a line
if (line.size() >= 4) { // And the line is long enough
if( line[2] == '1' && line[3] == '2' ){ // We check the condition
bornInDecember++ ; // 0-1 year, 2-3 month, 4-5 day
}
}
}
cout << "Amount of people born in december : "<< bornInDecember<< endl;
file.close();
}
system("pause");
return 0;
}
答案 1 :(得分:1)
std::getline( file, line );
std::cout << line << std::endl;
if( line.size() >= 4 && line[2] == '1' && line[3] == '2' )
...
您还应该使用while(std::getline(file, line))
代替while(file.good())
如果您编写代码并且您希望某个值是特定的值,则可以使用assert,如果该值不是预期的并且您立即捕获该错误。
#include <cassert>
assert(line.size() == 10 && "line size is not equal to 10");
答案 2 :(得分:0)
好。显然,当你的程序中使用的断言消息状态std :: string下标超出了下标2(来自行[2])或下标3(来自行[3])的范围。这意味着其中一行读取的行短于4个字符,因此您没有第四个字符(行[3])。可能是文件中的最后一行,如果你的文件中有尾随,则可能为空。
正如hidayat和Erik已经在他们的帖子中写道,你可以做的最少的事情就是检查线路是否足够长。