这是我上一个问题(Last item of istringstream repeats?)的扩展名。
我需要确定一个字符串是包含两个数据,还是三个。我正在使用' if'有条件确定这一点,但是我没有得到我希望得到的结果 - 我意识到我错过了一些东西。
if 的第一部分,检查是否只有名字和年龄 - 如果这不起作用,那么应该尝试下一部分(我的< strong> else if ),允许三个 - 其中有第一个,最后一个和年龄。当我尝试第一个,最后一个和年龄时,这不起作用(尽管如果我只有第一个和年龄),我从底部得到结果 else < / strong>声明 - 这意味着其他两个失败。这可以解释给我,并可能帮助我修改我的代码,以便它做我以后的事情吗?我真的很感谢你的帮助!
我的代码是:
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <fstream>
#include <map>
using namespace std;
int main(int argc, char * argv[]){
string file = "config.txt";
string line = "";
string tag = "";
string ansi = "";
map <string, string> m;
if(argc == 2){
file = argv[1];
}
ifstream in(file, ios_base::in | ios_base::binary);
if(!in){
cerr<<"could not open file";
}
while (getline(in, line)){
istringstream iss(line);
if(iss>>tag>>ansi){
auto it = m.find(tag);
if(it == m.end()){
m.insert(make_pair(tag,ansi));
}
}
}
for(auto x: m){
cout<<"\033[0;"<<x.second<<"m"<<x.first<<endl;
}
cout<<"\033[0;35mhello";
return 0;
}
答案 0 :(得分:0)
<强>问题强>
以下行中的条件
if (iss >> first >> age)
评估为false
,因为无法从字符串中提取age
。
以下行中的条件
else if (iss >> first >> last >> age)
由于iss
已处于错误状态,不会从iss
中提取任何输入。条件评估为false
。
这意味着,语句
下的代码块else
已执行。
一个解决方案
// Extract the first name
if ( !(iss >> first) )
{
// If we fail to extract the first name, the string is not right.
// Deal with error.
cout << "Failed" << endl;
exit(0); // ???
}
// Try to extract age.
if ( iss >> age )
{
// Age was successfully extracted.
cout << "Only first and age detected.";
}
else
{
// Clear the error state of the stream.
iss.clear();
// Now try to extract the last name and age.
if ( iss >> last >> age )
{
fullName = first + " " + last;
cout << fullName << " " << age << endl;
}
else
{
// Deal with error.
cout << "Failed" << endl;
exit(0); // ???
}
}