2017-03-19 14 views
0

私はキーを要求すると、負の(-7998482842)または正(898395893)の数字が返されますが、文字列が戻されます。私は、問題はここにあると思いファイルからデータを読み込んでマップに挿入するC++

string string 
[email protected] color1 
[email protected] color2 

ファイル形式table[name] = std::string(color);

誰かが助けてくださいことはできますか?

class table_data 
{ 
    public: 
    std::map<std::string, std::string> table; 

    bool read(std::string &fname) 
    { 
    std::ifstream ifs (fname, std::ifstream::in); 
    if(ifs.fail()) 
    { 
     printf("Cant open\n"); 
     return false; 
    } 
    return read(ifs); 
} 
bool read(std::istream &is) 
{ 
    for (std::string line; std::getline(is, line);) 
    { 
     char *name = strtok(const_cast<char*>(line.c_str()), " \r"); 

     if(name != nullptr) 
     { 
      char *color = strtok(nullptr, " "); 
      if(color != nullptr) 
      { 
       table[name] = std::string(color); 
      } 
      else 
      { 
       printf("No data %s\n", line.c_str()); 
       return false; 
      } 
     } 
     else 
     { 
      printf("No name\n"); 
      return false; 
     } 
    } 

    return true; 
    } 
std::string getcolor(std::string name) 
{ 
    std::map<std::string, std::string>::iterator it; 
    it = table.find(name); 
    if (it != table.end()) 
    { 
     return it->second; 
    } 

    } 
}; 
+3

'のchar *色=はstrtok(nullptr、"「); '? –

+1

'const_cast'の' std :: string'は未定義の動作です。代わりに他の方法を使用してください。この質問を参照してください:http://stackoverflow.com/questions/289347/using-strtok-with-a-stdstring – pergy

+0

はい、どのように文字列にcharを入れるのですか? – Rabbit

答えて

0

あなたは行を分割するstd::stringstreamを使用することができます。

#include <sstream> 
//... 
bool read(std::istream &is) 
{ 
    for (std::string line; std::getline(is, line);) 
    { 
    std::string name, color; 
    std::stringstream ss(line); 
    if (ss >> name) 
    { 
     if(ss >> color) 
     { 
     table[name] = color; 
     } 
     else 
     { 
     printf("No data %s\n", line.c_str()); 
     return false; 
     } 
    } 
    else 
    { 
     printf("No name\n"); 
     return false; 
    } 
    } 
    return true; 
} 
+0

はエラーを返します:変数 'std :: stringstream ss'に初期化子がありますが、不完全な型があります std :: stringstream ss(line); – Rabbit

+0

'#include 'を追加しました。回答も更新しました。 – cbuchart

+0

問題を解決できますか? – cbuchart

0

strtokは、従来のCの事です。新しいC++コードでは、解析される文字列を変更するため、また文字列がヌルで終了すると仮定しているため、これはおそらく避けるべきです。

std::string::find_first_ofstd::string::find_first_not_ofはどうですか?

のような何か:

bool read(std::istream &is) 
{ 
    for (std::string line; std::getline(is, line);) 
    { 
    auto name_start = line.find_first_not_of(" \r"); 
    if (name_start == std::string::npos) 
    { 
     std::clog << "No name\n"; 
     return false; 
    } 
    auto name_end = line.find_first_of(" \r", name_start); 
    if (name_end == std::string::npos) 
    { 
     std::clog << "No name\n"; 
     return false; 
    } 
    std::string name{line, name_start, name_end - name_start}; 
    std::cout << "name='" << name << "'\n"; 

    auto color_start = line.find_first_not_of(" ", name_end); 
    if (color_start == std::string::npos) 
    { 
     std::clog << "No color\n"; 
     return false; 
    } 
    auto color_end = line.find_first_of(" ", color_start); 
    if (color_end == std::string::npos) 
    { 
     std::clog << "No color\n"; 
     return false; 
    } 
    std::string color{line, color_start, color_end - color_start}; 
    std::cout << "color='" << color << "'\n"; 

    table[name] = std::move(color); 
    } 

    return true; 
} 
関連する問題