【问题标题】:How to read input from file and pair into a map in C++如何从文件中读取输入并将其配对到 C++ 中的映射中
【发布时间】:2019-02-13 05:56:32
【问题描述】:

我正在尝试阅读可能如下所示的文本文件。

HI bye
goodbye

foo bar
boy girl
one two three

我试图将只有两个单词的行存储在地图中,第一个单词是键,第二个单词是值。

下面是我想出的代码,但我不知道如何忽略上面没有两个单词的行。

  • 这只有在每行有两个单词时才能正常工作。我理解为什么这只有在每行都有两个单词时才有效,但是我不确定我可以添加什么条件来防止这种情况。

配对我的配对; 映射我的地图;

while(getline(file2, line, '\0'))
{
    stringstream ss(line);
    string word;
    while(!ss.eof())
    {
        ss >> word;
        myPair.first = word;
        ss >> word;
        myPair.second = word;

        myMap.insert(myPair);
    }
}

map<string, string>::iterator it=myMap.begin();

for(it=myMap.begin(); it != myMap.end(); it++)
{
    cout<<it->first<<" "<<it->second<<endl;
}

【问题讨论】:

  • 读一个单词,如果失败不添加。读第二个字。如果失败,请不要添加。读第三个字。如果它成功,则不要添加。只有当您阅读两个单词时,您才能添加。
  • '\0' 不是此处使用的正确分隔符。您确定此代码按原样工作吗?

标签: c++ c++11


【解决方案1】:

将两个单词读入一个临时对。如果不能,请不要将该对添加到地图中。如果你能读两个词,看看你是否能读第三个词。如果可以的话,你的字太多就行了。不要添加。

例子:

while(getline(file2, line, '\0'))
{
    stringstream ss(line);
    pair<string,string> myPair;
    string junk;
    if (ss >> myPair.first >> myPair.second && !(ss >> junk))
    { // successfully read into pair, but not into a third junk variable
        myMap.insert(myPair);
    }
}

【讨论】:

    【解决方案2】:

    让我建议一些不同的实现

    std::string line;
    while (std::getline(infile, line)) {
        // Vector of string to save tokens 
        vector <string> tokens; 
    
        // stringstream class check1 
        stringstream check1(line); 
    
        string intermediate; 
    
        // Tokenizing w.r.t. space ' ' 
        while(getline(check1, intermediate, ' ')) { 
            tokens.push_back(intermediate); 
        }
    
        if (tokens.size() == 2) {
            // your condition of 2 words in a line apply
            // process 1. and 2. item of vector here
        }
    }
    

    【讨论】:

    • 为什么不使用if (check1 &gt;&gt; word1 &gt;&gt; word2) { 来查看是否可以从流中读取 2 个单词?
    • @MartinYork 你是完全正确的,标记的答案有点复杂。
    【解决方案3】:

    您可以使用 fscanf 从文件中获取输入,使用 sscanf 从带有格式的字符串中获取输入。 sscanf 返回给定格式成功输入的数量。这样您就可以轻松检查一行有多少个单词。

    #include<stdio.h>
    #include<stdlib.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        char line[100];
        FILE *fp = fopen("inp.txt", "r");
        while(fscanf(fp, " %[^\n]s", line) == 1)
        {
            cout<<line<<endl;
            char s1[100], s2[100];
            int take = sscanf(line, "%s %s", s1, s2);
            cout<<take<<endl;
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 2020-09-20
      • 2018-12-28
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多