Ошибка MVS C ++: строковый индекс вне диапазона - PullRequest
0 голосов
/ 28 марта 2011

Я хочу решить следующую задачу:

Дан текстовый файл "pesel.txt", который содержит 150 национальных идентичностей.Каждая строка содержит один национальный идентификатор, который представляет собой 11-значный номер.Первые две цифры слева определяют год, в котором человек родился, следующие две цифры определяют месяц, а следующие две определяют день.

Чтобы сократить:

цифры 0-1 = цифры года 2-3 = цифры месяца 4-5 = цифры дня 6-11 = определить что-то еще, что здесь не важно

Мне нужно прочитать файл, проверить, сколько людей родилось в декабре.Я пытаюсь сделать это следующим образом:

  • читать каждую строку, пока не будет достигнут конец файла
  • в каждой строке Я проверяю, равен ли третий символ в строке 1 и если четвертыйсимвол равен 2, если да, я увеличиваю переменную, это мой счетчик для людей, родившихся в декабре, в противном случае выполняется следующая итерация цикла

Вот код:

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 ]

2 голосов
/ 28 марта 2011

while file.good() неверно - getline все равно не удастся.Вы читаете последнюю строку файла, обрабатываете его, file.good() все еще имеет значение true, затем пытаетесь прочитать еще одну строку, и 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 голос
/ 28 марта 2011

перед 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");
0 голосов
/ 28 марта 2011

Хорошо. Очевидно, что, как говорится в сообщении об утверждении, подстрочный индекс std :: string, используемый в вашей программе, находится вне диапазона, который равен либо подстрочному значению 2 (из строки [2]), либо нижнему нижнему показателю 3 (из строки [3]). Это означает, что одна из прочитанных строк короче 4 символов, и поэтому у вас нет такой вещи, как четвертый символ (строка [3]). Возможно, это последняя строка в файле, которая может быть пустой, если у вас есть трейлинг в вашем файле.

Как Хидаят и Эрик уже написали в своих постах, минимум, что вы можете сделать, это проверить, достаточно ли длинна строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...