使用条件来确定字符串中的元素

时间:2015-10-25 04:08:20

标签: c++ string stringstream

这是我上一个问题(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;
}

1 个答案:

答案 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); // ???
   }
}