Как читать входные данные из файла и пары в карту в C ++ - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь прочитать текстовый файл, который может выглядеть следующим образом.

HI bye
goodbye

foo bar
boy girl
one two three

Я пытаюсь взять строки только из двух слов и сохранить их на карте, первое слово будетбудет ключом, а второе слово будет значением.

ниже приведен код, который я придумал, но я не могу понять, как игнорировать строки, в которых нет двух слов.

  • это работает правильно, только если в каждой строке есть два слова.Я понимаю, почему это работает, только если в каждой строке есть два слова, но я не уверен, какое условие я могу добавить, чтобы предотвратить это.

pair myPair;map 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 голосов
/ 13 февраля 2019

позвольте мне предложить немного другую реализацию

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
    }
}
0 голосов
/ 13 февраля 2019

Вы можете использовать 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;
}
0 голосов
/ 13 февраля 2019

Прочитайте два слова во временной паре.Если вы не можете, не добавляйте пару на карту.Если вы можете прочитать два слова, посмотрите, можете ли вы прочитать третье слово.Если вы можете, у вас слишком много слов в строке.Не добавляйте.

Пример:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...