0

ファイルの内容を解析してマップに読み込みたい。

これはファイル コンテンツの形式です。

Movie-name   release-year   price  cast  ishd 

"DDLG" 2010 20.00 "shahrukh and Kajal" true
"Aamir" 2008 10.00 "abc, xyz and ijkl" false

マップのキーは最初の単語 (映画名) になります。

クラス定義:

class movieInfo
{
        private:
        int releaseYear;
        double price;
        string cast;
        bool isHD;
};

これは私が実装しようとしている機能です。

void fill_map_contents (map <string, movieInfo*> &mymap, ifstream& myfile)
{
    string line;
    string word;
    while (getline(myfile, line))
    {
        out << "inside while loop " << line << endl;
        stringstream tokenizer;
        tokenizer << line;
        movieInfo *temp = new movieInfo;
        while  (tokenizer >> word)
        {
            cout << " printing word :->"<< word << endl;
            //temp->releaseYear = atoi(word);
            //temp->price = 12.34;
            //temp->cast = "sahahrukh salman";
            //temp->isHD = false;   

            mymap[word] = temp;
        }
        delete temp;
    }
}

しばらくの間 (トークナイザー >> 単語)、オブジェクト変数を埋めてマップに割り当てる方法がわかりません。

どんな助けでも大歓迎です。

デベシュ

4

3 に答える 3

2
        cout << " printing word :->"<< word << endl;
           //temp->releaseYear = atoi(word);
           //temp->price = 12.34;
        //temp->cast = "sahahrukh salman";
        //temp->isHD = false;   

上記のコードでは、クラスのプライベートメンバーに直接アクセスしようとしていますが、これは不可能です。したがって、より良い解決策は、次のように各変数にパブリックゲッター/セッターを含めることです。

       public:
               void setreleaseYear(int sry){releaseYear=sry;}
               void setprice(double pr){price=pr;}
               void setcast(string cast){string=str;}
               void setisHD(bool id){isHD=id;}

コメント付きコードの代わりに使用するようになりました:

               //temp->releaseYear = atoi(word);
                temp->setreleaseYear(atoi(word));
                tokenizer >> word;
                //temp->price = 12.34;
                temp->setprice(atof(word));
                tokenizer >> word;
                //temp->cast = "sahahrukh salman";
               temp->setcast(word);
               tokenizer >> word;
               //temp->isHD = false;  
                temp->setisHD(word);

while ループは必要ありません。

于 2013-10-31T12:16:38.137 に答える
0

区切り文字と引用符としてスペースを使用して、効果的にCSV ファイルを解析しようとしています。"

これには、このようなライブラリを使用することをお勧めします。サンプルコード (ヘルプページから引用):

// Note: I changed mymap to map<string, movieInfo> without a pointer - it's not
// needed

const char field_terminator = ' '; // Use a space
const char line_terminator  = '\n'; // Use line break
const char enclosure_char   = '"'; // Use "
csv_parser file_parser;

file_parser.set_skip_lines(1);
file_parser.init(filename);

file_parser.set_enclosed_char(enclosure_char, ENCLOSURE_OPTIONAL);
file_parser.set_field_term_char(field_terminator);
file_parser.set_line_term_char(line_terminator);

while(file_parser.has_more_rows()) {
    csv_row row = file_parser.get_row();

    movieInfo temp; // No need for pointers
    temp->releaseYear = atoi(row[1]); // C++11: Use std::stoi()
    temp->price = atof(row[2]); // C++11: Use std::stof()
    temp->cast = row[3];
    temp->isHD = row[4].compare("true") == 0;
    mymap[row[0]] = temp;
}
于 2013-10-31T12:17:43.800 に答える