如何从文件中读取单词,将它们分配给数组并分析其内容?

Posted

技术标签:

【中文标题】如何从文件中读取单词,将它们分配给数组并分析其内容?【英文标题】:How do I read words from a file, assign them to an array and analyze its content? 【发布时间】:2019-12-15 14:56:39 【问题描述】:

我(一位教授鼓励在线研究以完成项目的学生)有一项任务,我必须分析文件的内容(某些单词的频率、总单词计数、最大和最小单词),但我遇到了困难甚至打开文件,以便程序可以说出单词。我试图只计算它读到的单词,但我什么也没得到。据我了解,该程序应该打开选定的 .txt 文件,逐字检查其内容并立即输出。

代码如下:

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

    string selected[100];
    //open selected file.
    ifstream file;
    file.open(story.c_str());
    string line;
    if (!file.good())
    
        cout << "Problem with file!" << endl;
        return 1;
    
    while (!file.eof())
    
        getline(file, line);

        if (line.empty())
            continue;

        istringstream iss(line);

        for (string word; iss >> word;)
            cout << word << endl;

    ```




【问题讨论】:

调用main()是未定义的行为 您和要求最小化代码的人之间存在误解。请阅读并应用这个概念:minimal reproducible example 我建议将代码(这与上面的 MRE 想法不矛盾)简化到只尝试从文本文件中读取的程度。这样您就可以避免与调用main() 相关的所有未知数。您知道main() 是始终启动程序的函数,不是吗?所以试着让main()从文件中读取一个单词,然后继续让事情变得更复杂。 以上代码并不是一个完整的程序。相比之下,大多数“hello world”程序都是完整的,尽管很小。您可能希望先让一个简单的程序运行起来,然后添加功能让您更接近您需要的位置,直到出现问题 - 然后寻求帮助。 我猜它甚至没有打开 .txt 因为它无法访问文件本身? (修正了那个位。)现在它逐字打印出文件(进度),但我不知道如何一次将它分配给一个 100 个字的数组,所以我可以使用其他代码位来分析它。 (在将它放入数组之前,我不需要更多解释,我很感激到目前为止的帮助!) 【参考方案1】:

因为附上的代码比较简单,这里就不做详细解释了。使用std::algorithm,每项任务都可以在单行中执行。

我们会将完整的源文件读入一个std::string。然后,我们定义一个std::vector 并用所有单词填充它。这些词是由一个超简单的正则表达式定义的。

使用std::map 的标准方法计算频率。

#include <fstream>
#include <string>
#include <iterator>
#include <vector>
#include <regex>
#include <iostream>
#include <algorithm>
#include <map>

// A word is something consiting of 1 or more letters
std::regex patternForWordR"((\w+))";

int main() 

    // Open file and check, if it could be opened
    if (std::ifstream sampleFile "r:\\sample.txt" ; sampleFile) 

        // Read the complete File into a std::string
        std::string wholeFile(std::istreambuf_iterator<char>(sampleFile), );

        // Put all words from the whole file into a vector
        std::vector<std::string> words(std::sregex_token_iterator(wholeFile.begin(), wholeFile.end(), patternForWord, 1), );

        // Get the longest and shortest word
        const auto [min, max] = std::minmax_element(words.begin(), words.end(),
            [](const std::string & s1, const std::string & s2)  return s1.size() < s2.size(); );

        // Count the frequency of words
        std::map<std::string, size_t> wordFrequency;
        for (const std::string& word : words) wordFrequency[word]++;

        // Show the result to the user
        std::cout << "\nNumber of words: " <<  words.size() 
            << "\nLongest word: " << *max << "  (" << max->size() << ")"
            << "\nShortest word: " << *min << "  (" << min->size() << ")"
            << "\nWord frequencies:\n";
        for (const auto& [word, count] : wordFrequency) std::cout << word << " --> " << count << "\n";

    
    else 
        std::cerr << "*** Error:  Problem with input file\n\n";
    
    return 0;

【讨论】:

以上是关于如何从文件中读取单词,将它们分配给数组并分析其内容?的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件中读取单词并存储到 C 中的动态数组 Valgrind 错误中

如何将文本文件中的值分配给python函数中的数组并将其用作全局?

读取单词并将它们存储到数组中

如何从 txt 文件中读取特定的单词和数字并将它们保存在矩阵中

如何将csv中的单词分配给变量? [复制]

从文件中读取浮点数/单词/符号并仅将浮点数存储在数组 C++ 中