2011-10-19 6 views
1

ルビーで作成したハッシュをC++マップに変換する方法はありますか?私はファイルにハッシュを印刷しようとしましたが、C++マップに読み込む方法を知らないです。ハッシュは、次のように印刷されルビーハッシュをC++マップに変換する

stringA => 123 234 345 456 567 
stringB => 12 54 103 313 567 2340 
... 

数値の量は、各関連付けられた文字列のために変化し、文字列はユニークです。

各行の文字列と配列の部分を個別に読み取るにはどうすればよいですか。はい、それは可能である

#include <unordered_map> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <vector> 

std::ifstream infile("thefile.txt"); 
std::string line; 

std::unordered_map<std::string, std::vector<int>> v; 

while (std::getline(infile, line) 
{ 
    std::string key, sep; 
    int n; 

    std::istringstream iss(line); 

    if (!(iss >> key >> sep)) { /* error */ } 
    if (sep != "=>")   { /* error */ } 

    while (iss >> n) v[key].push_back(n); 

    // maybe check if you've reached the end of the line and error otherwise 
    // or maybe add the option to end a line at a comment character 
} 

答えて

1

単なるジェーンフォーマットされた入力を使用しています。

#include <fstream> 
#include <iterator> 
#include <string> 
#include <map> 
#include <vector> 
#include <algorithm> 

int main() { 
    std::ifstream input("your_file.txt"); 
    std::map<std::string,std::vector<unsigned int>> stringMap; 
    std::string key, dummy; // dummy is for eating the "=>" 
    while(input >> key >> dummy) { 
     std::copy(std::istream_iterator<int>(input), 
        std::istream_iterator<int>(), 
        std::back_inserter(stringMap[key])); 
     input.clear(); 
    } 
} 

いくつかの注意:簡単な解決策は、このようになります。

  • stringMap[key]どれもまで、ファイルから整数を読み込むしようとしますまだ
  • std::istream_iterator<int>存在しない場合、マップに新しいエントリを作成します。 (整数に変換できない文字など)エラーが発生した場合、またはストリームの末尾に到達した場合
  • input.clear()はストリームからエラーをクリアします(上記のstd::copyいつもあなたは、期待どおりのキーは整数として解析することができる場合は、このソリューションが動作しません、または、彼らはスペース

が含まれている場合は、これらの制限は、あなたのための厳格にしている場合)、エラーで

  • を可能性が終わるでしょう詳細はBoost.Spirit.Qiをご覧ください。

  • +0

    文字列にスペースが含まれていると、これは失敗します。 'スペース付きの文字列=> 1 2 3' –

    +0

    @DavidRodríguez-dribeas:そうです。必要な場合は、最初の入力操作を '=>'を待つループで置き換えるか、 'substr()'を使用して区切り文字を探します。 OPが必要かどうかを明確にするためにOPを歓迎します。 –

    +0

    文字列にはスペースは含まれませんが、文字列として有効な数字にすることができます。 thanks – zanbri

    0

    +1

    文字列にスペースが含まれていると失敗します。数字が '10 => 1 2 3 4 5'のように文字列として有効であれば失敗します。 "10"は有効な文字列ですが、有効な数字です。 –

    関連する問題