如何读取文件并按类别对其进行排序

时间:2019-07-26 01:01:04

标签: c++ ifstream

我正在尝试从文件中读取一堆单词,并将它们分类为什么样的单词(名词,形容词,动词等)。例如:

-Nouns;

zyrian
zymurgy
zymosis
zymometer
zymolysis


-Verbs_participle;

zoom in
zoom along
zoom
zonk out
zone

我正在使用getline读取直到分隔符';'但是我怎么知道什么时候读类型和什么时候读单词呢?

下面的功能在“-名词”之后停止。

int main()
{
    map<string,string> data_base;
    ifstream source ;
    source.open("partitioned_data.txt");
    char type [MAX];
    char word [MAX];

    if(source) //check to make sure we have opened the file
    {
        source.getline(type,MAX,';');
        while( source && !source.eof())//make sure we're not at the end of file
        {
            source.getline(word,MAX);
            cout<<type<<endl;
            cout<<word<<endl;

            source.getline(type,MAX,';');//read the next line
        }
    }


    source.close();
    source.clear();
    return 0;

}

1 个答案:

答案 0 :(得分:0)

我不确定您输入文件的格式。但是您似乎有一个带有行的文件,其中的项目之间用分号分隔。

阅读此书的方法应有所不同。

请参见以下示例:

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

std::istringstream source{R"(noun;tree
noun;house
verb;build
verb;plant
)"};

int main()
{
    std::string type{};
    std::string word{};
    //ifstream source{"partitioned_data.txt"};

    if(source) //check to make sure we have opened the file
    {
        std::string line{};
        while(getline(source,line))//make sure we're not at the end of file
        {
            size_t pos = line.find(';');
            if (pos != std::string::npos) {
                type = line.substr(0,pos);
                word = line.substr(pos+1);
            }
            std::cout << type << " --> " << word << '\n';
        }
    }
    return 0;
}
  • 不需要打开和关闭语句。构造函数和 std::ifstream的析构函数将为我们做到这一点。
  • 请勿在while语句中检查eof
  • 不要,永远不要使用char type [MAX];之类的C样式数组

在while语句中读取一行,并在while中检查操作的有效性。然后,在读取行上工作。

搜索“;”在字符串中,然后找到子字符串。

如果我想知道输入文件的格式,那么我会为你写一个更好的例子。

由于我没有SO上的文件,因此我改用std::istringstream。但是与文件相比没有任何区别。只需删除源代码中的std::istringstream并取消注释ifstream定义。