(C ) Я пытаюсь прочитать и вывести случайную строку из текстового файла, и я продолжаю получать «Исключение с плавающей запятой (сброс ядра)» при его запуске

#c #fstream #coredump #floating-point-exceptions

#c #fstream #coredump #исключения с плавающей запятой

Вопрос:

В основном то, что говорится в названии. Я пытаюсь написать код, который будет принимать случайное слово из файла с именем «words.txt » и выведите его на экран. Я запускаю его и продолжаю получать ошибку «Исключение с плавающей запятой (сброс ядра)».

Вот код:

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

using namespace std;

int main ()
{
  vector<string> word;
  fstream file;
  file.open("words.txt");
  cout << word[rand()% word.size()]<<endl;
 return 0;
}
  

И вот «words.txt «

 duck
goose
red
green
phone
cool
beans
  

Спасибо, ребята!

Комментарии:

1. Как вы думаете word.size() , что будет в этом случае? И кстати. на самом деле вы здесь ничего не читаете. Вы удалили эту часть своего кода из вопроса?

2. потому std::vector<string> word что имеет размер 0 в cout << word[rand()% word.size()]<<endl;

3. сначала вам нужно прочитать файл)

4. @churill что вы имеете в виду?

5. Проблема в том, что вы никогда не читаете файл, поэтому слово vector пустое. Вы не можете получить доступ к случайному индексу пустого вектора. Ошибка с плавающей запятой — это деление на 0. Которое, хотя и является целочисленной операцией, отображается как выполнение с плавающей запятой в некоторых операционных системах.

Ответ №1:

Вы только что открыли файл и не прочитали это. word не имеет элементов, поэтому word[rand()% word.size()] что-то делится на ноль. Деление на ноль не допускается.

Также вы должны проверить, удалось ли открытие файла и что-то действительно прочитано.

Попробуйте это:

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

using namespace std;

int main ()
{
  vector<string> word;
  fstream file;
  file.open("words.txt");
  if (!file) // check if file is opened successfully
  {
    cerr << "file open failedn";
    return 1;
  }
  for (string s; file >> s; ) word.push_back(s); // read things
  if (word.empty()) // check if something is read
  {
    cerr << "nothing is readn";
    return 1;
  }
  cout << word[rand()% word.size()]<<endl;
  return 0;
}
  

Комментарии:

1. @AnthonyO Исправленный код будет работать . Вы скомпилировали код? Также проверьте, существует ли файл.

2. Боже мой, я такой глупый. Я назвал файл «words.txt » так это было на самом деле «words.txt.txt »

3. Это распространенная ошибка в MS Windows, потому что проводник файлов ОС по умолчанию скрывает расширения файлов для известных типов. Возможно, вы захотите изменить настройки своего проводника, чтобы отключить эту раздражающую функцию.

4. Примечание: знание того, что вы глупы, является первым шагом к улучшению и достижению. Зная, что ты умный… Это редко заканчивается хорошо.

Ответ №2:

Вам просто нужно сохранить список слов в текстовом файле в виде вектора после его чтения.

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

using namespace std;

int main ()
{
    vector<string> words;
    ifstream file("words.txt");
    string line;
    while (getline(file, line)){
        words.push_back(line); // adds each line of words into vector
    }
cout << words[rand() % words.size()] << endl;
return 0;
}