我正在尝试通读一个可能看起来像下面的文本文件。
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;
}
答案 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;
}