Почему я получаю ошибку «ошибка сегментации» при запуске программы?

0

Я пытаюсь прочитать в файле (input.txt) и перейти строку за строкой и сохранить только слова в векторе (имя). это часть большого проекта, но я застрял здесь. Однако программа компилируется, когда я запускаю ее, я получаю сообщение об ошибке "Segmentation Fault". Я просмотрел свою программу и не могу найти ошибку. я считаю, что это в моем цикле for и как я это сформулировал, но не знаю, как изменить его, чтобы программа работала правильно. Если бы вы могли дать мне несколько советов о том, как изменить его или даже рассказать мне, что случилось, я знаю, с чего начать, что было бы здорово! благодарю!

#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<sstream>

using namespace std;



int main()
{
    ifstream inf;
    inf.open("input.txt");//open file for reading
    string s;
    getline(inf, s);
    string word;
    vector<int> index;// for later in my project ignore
    vector<string> name;// store the words from the input file
    while( !inf.eof())//while in the file
    {
            istringstream instr(s);//go line by line and read through the string
            string word;
            instr >> word;

            for(int i=0;i<word.length(); i++) //go word by word in string checkin if word and if it is then parseing it to the vector name
               {
                    if(!isalpha(word[i]))
                           name.push_back(word);

                cout<<name[i]<<endl;
            }
    }
    inf.close();
    return 0;
}
  • 0
    Segfault и stacktrace должны сообщить вам, где именно проблема.
  • 0
    Было бы неплохо найти достойный учебник по чтению файлов в c ++, у вас есть ошибки
Показать ещё 1 комментарий
Теги:
for-loop
segmentation-fault
istringstream

1 ответ

1

Вы индексировать name вектор с переменным циклом вы используете итерировать word строки. Поскольку у вас есть инструкция if, вполне возможно, что name.push_back(word); никогда не вызывается, и сразу вы ошибочно индексируете name.

for(int i=0;i<word.length(); i++)
{
    // If this fails, nothing is pushed into name
    if(!isalpha(word[i]))
        name.push_back(word);

    // But you're still indexing into name with i.
    cout<<name[i]<<endl;
}

Просто напечатайте слово из цикла, не нужно индексировать вектор.

for(int i=0;i<word.length(); i++)
{
    if(!isalpha(word[i]))
    {
        name.push_back(word);
        cout << "Found word: " << word << endl;
    }
}
  • 0
    Я хочу, чтобы, если это на самом деле не слово, оно не подтолкнуло его к имени. я должен добавить оператор else, который учитывает, когда это что-то отличное от слова?
  • 0
    Затем измените !isalpha на isalpha .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню