(C++)我正在尝试从文本文件中读取和输出随机行,并且在运行它时不断收到“浮点异常(核心转储)”

Posted

技术标签:

【中文标题】(C++)我正在尝试从文本文件中读取和输出随机行,并且在运行它时不断收到“浮点异常(核心转储)”【英文标题】:(C++) I am trying to read and output a random line from a text file and I keep getting "Floating Point Exception (Core Dumped)" when running it 【发布时间】:2020-10-30 17:00:30 【问题描述】:

基本上就是标题所说的。我正在尝试编写代码,该代码将从名为“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

谢谢大家!

【问题讨论】:

您认为word.size() 在这种情况下会是什么?顺便说一句。您实际上并没有在这里阅读任何东西。您是否从问题中删除了那部分代码? 因为std::vector&lt;string&gt; wordcout &lt;&lt; word[rand()% word.size()]&lt;&lt;endl; 中的大小为0 首先你需要读取文件) @churill 你是什么意思? 问题是你从来没有读过文件,所以词向量是空的。您无法访问空向量的随机索引。浮点错误除以 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 failed\n";
    return 1;
  
  for (string s; file >> s; ) word.push_back(s); // read things
  if (word.empty()) // check if something is read
  
    cerr << "nothing is read\n";
    return 1;
  
  cout << word[rand()% word.size()]<<endl;
  return 0;

【讨论】:

@AnthonyO 固定代码将work。你编译代码了吗?还要检查文件是否存在。 天哪,我太笨了。我将文件命名为“words.txt”,所以它实际上是“words.txt.txt” 这是 MS Windows 上的常见错误,因为 OS 文件资源管理器默认隐藏已知类型的文件扩展名。您可能需要更改您的资源管理器设置以关闭此烦人的功能。 旁注:知道自己很愚蠢是进步和成就的第一步。知道你很聪明......这很少有好的结局。【参考方案2】:

你只需要将txt文件中的单词列表读取后保存为向量即可。

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

【讨论】:

以上是关于(C++)我正在尝试从文本文件中读取和输出随机行,并且在运行它时不断收到“浮点异常(核心转储)”的主要内容,如果未能解决你的问题,请参考以下文章

读取随机行 com 文件

从巨大的 CSV 文件中读取随机行

从文件中读取随机行的简单方法是啥?

Clojure 懒惰地从文件中读取随机行

读取大型 csv 文件、python、pandas 的随机行

R:使用 fread 或等价物从文件中读取随机行?