Подтвердить что ты не робот

Ошибка сегментации при попытке доступа к вектору - cpp

Я написал код в С++. Он считывает данные из файла CSV, а затем просто печатает вторую строку на экране:

vector<string> readCsvFileContent()
{
    vector<string> buffer;

    try {
        ifstream inputFile;
        string line;

        inputFile.open("Input.csv", static_cast<std::ios::openmode>(std::ios::in) );

        while (getline(inputFile,line)) {
            buffer.push_back(line);
        }

       inputFile.close();
    }
    catch (ifstream::failure e) { 
        cout<<"No file read"<<endl;            
        throw e;
    }

    return buffer;
}

Эта функция вызывается следующим образом:

cout << "reading from file" << endl;
vector<string> inputData = readCsvFileContent();
cout << inputData.size() << endl;
cout << inputData[1] << endl;

Когда он запускается в отладке, он отображает, что ему нужно:

[ 50%] Building CXX object src/CMakeFiles/version1.dir/version1.cc.o
Linking CXX executable version1
[ 50%] Built target version1
[100%] Generating House1.csv
reading from file
322274
"2014-07-01 00:00:06",155,0,0,0,NULL,0,0,0,0,NULL
[100%] Built target process_csv

Но когда я запускаю свой код, я получаю:

reading from file
0
Segmentation fault (core dumped)
4b9b3361

Ответ 1

Вы получаете segfault, потому что вы читаете за пределами границ векторов

inputData.size() // 0 i.e. empty
inputData[1] // undefined behaviour

В вашем коде должен быть проверен, успешно ли открыт файл. Вы можете сделать это:

if (!inputFile.is_open())
    // throw or whatever

Или, поскольку вы, кажется, уже готовы к этому с try-catch, как указывает molbdnilo, вы можете попросить поток сбросить неудачу:

inputFile.exceptions(std::ifstream::failbit);

Чтобы проверить, был ли файл пустым, просто отметьте inputData.size(), который вы уже распечатываете, но игнорируете.

Теперь, оставшийся вопрос: зачем он работает в отладке, но не в выпуске? Ну, у моего хрустального шара нет батареи, но я могу предположить, что ваши сборки имеют разные рабочие каталоги, а файл отсутствует или не читается в другом. Вы не рассказали о том, что делает ваша сборка, но это может иметь значение:

[100%] Создание House1.csv

inputFile.open( " Input.csv", static_cast (std:: ios:: in));