如何从文件读取输入并配对到C ++中的映射

时间:2019-02-13 05:56:32

标签: c++ c++11

我正在尝试通读一个可能看起来像下面的文本文件。

HI bye
goodbye

foo bar
boy girl
one two three

我正在尝试仅用两个单词进行一行并将它们存储在地图中,第一个单词将是键,第二个单词将是值。

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

  • 这仅在每行包含两个单词的情况下才能正常工作。我知道为什么只有在每行都有两个单词的情况下才起作用,但是我不确定可以添加什么条件来防止这种情况。

配对myPair;     映射myMap;

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

3 个答案:

答案 0 :(得分:4)

将两个单词读成一个临时对。如果不能,请不要将其添加到地图中。如果您可以阅读两个单词,请查看您是否可以阅读第三个单词。如果可以的话,您的行数过多。不要添加。

示例:

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

答案 1 :(得分:3)

让我建议一些不同的实现

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

答案 2 :(得分:1)

您可以使用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;
}