#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;
}