MVS C ++错误:字符串下标超出范围

时间:2011-03-28 10:56:03

标签: c++ string

我想解决以下任务:

给出了一个文本文件“pesel.txt”,其中包含150个国家身份。每行包含一个国家身份,这是一个11位数字。左边的前两位数确定一个人出生的年份,接下来的两位数确定月份,接下来的两位数确定日期。

缩短:

数字0-1 =年份 数字2-3 =月 数字4-5 =天 数字6-11 =确定别的东西,这里不重要的是什么

我需要阅读该文件,检查12月份出生的人数。我正在尝试以下方式:

  • 读取每一行直到文件结束
  • 在每一行我检查字符串中的第三个字符是否等于1,如果第四个字符等于2,如果是,我增加变量,这是我在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;
}

问题是我收到以下错误,我不知道为什么......

http://img10.imageshack.us/i/mvserr.png/

3 个答案:

答案 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)

在if之前,打印出行并查看它是否具有正确的值,您还可以在访问之前检查行的长度:

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已经在他们的帖子中写道,你可以做的最少的事情就是检查线路是否足够长。