2012-04-22 14 views
-1

これは私が読む必要があるファイルです。このファイルを変数に読み込む方法は?

Coca-Cola,0.75,20 
Root Beer,0.75,20 
Sprite,0.75,20 
Spring Water,0.80,20 
Apple Juice,0.95,20 

私はこれを変数にする必要があります。 たとえば、drinkName、drinkCost、drinkQuantityなどです。 私はC++を使用しています。助けてください。他人から一つの項目を分離する方法を調べることにより

+3

この宿題はありますか? –

+0

質問の形式が正しくないため、回答の大部分が無効でした。書式が修正されると、データの読み込みは、これまでに登場したよりもはるかに(そしてより単純な)問題であることが明らかになります。 –

答えて

1

スタート:

その後

あなたはフォーマットと新しい文字列持ってしようとしている(スペースを介して)

How to split a string in C++?drinkName,drinkCost,drinkQuantity

あなたの場合をそれについて考えると、商品の各情報を区切るものはシンボル,(コンマ)なので、コンマで区切る方法を示すので、this postをチェックする必要があります。

この情報を保存する上で支援するために、あなたは3つの変数がある新しいデータ型(クラス)を作成できます。終わりに

class Drink 
{ 
public: 
    std::string name; 
    std::string value;  // or float 
    std::string quantity; // or int 
}; 

を、あなたは内のすべての情報で素敵なstd::vector<Drink>を持つことができます。

+0

彼は正しいです。あなたは、あなたのデータをどのように読んでいくかについて、自由度があります。 3つの値をすべて文字列として読み込み、カンマを探して文字列を解析することができます。私の例に従えば、別々に文字列として読み込み、適切な型に変換することができます。 –

6

これらの3つの変数を1つのデータ型にまとめることをお勧めします。 「ドリンク」と呼ぶことができます。

struct DrinkT{ 
    std::string name; 
    float cost; 
    unsigned int quantity; 

    DrinkT(std::string const& nameIn, float const& costIn, unsigned int const& quantityIn): 
    name(nameIn), 
    cost(costIn), 
    quantity(quantityIn) 
    {} 
}; 

これには多くの利点があります。
あなたは次のようにドリンクを作成することができます:

DrinkT coke("Coca-Cola",0.75,20); 

をし、このように変数にアクセス:飲み物のオブジェクトのみが指定したものを開催します

std::cout << coke.name << std::endl;  //outputs: Coca-Cola 
std::cout << coke.cost << std::endl;  //outputs: 0.75 
std::cout << coke.quantity << std::endl; //outputs: 20 

:飲み物の名前を、ドリンク代、ドリンク量が含まれています。
オブジェクトには、これら3つの値のすべてを構築するコンストラクタがあります。
これは、すべての値を同時に指定する場合にのみ、飲み物オブジェクトを作成できることを意味します。

ドリンクオブジェクトをたくさん保管している場合(そして何個か知っているかもしれない場合)、それらを何らかの容器に入れたい場合もあります。
ベクターは良い選択です。あなたが保存したいだけ多くの飲み物を説明するために、ベクターは成長します。

ファイルをループして、3つの値を個別に読み込み、ベクターに保存しましょう。我々はファイルの終わりに達するまで、飲み物ごとにこれを何度も繰り返します。 G ++ -std = C++ 0X -o主主でコンパイル

int main(){ 

    std::ifstream infile("file.txt"); 
    std::vector<DrinkT> drinks; 

    std::string name; 
    std::string cost; 
    std::string quantity; 

    std::getline(infile,name,','); 
    std::getline(infile,cost,','); 
    std::getline(infile,quantity,' '); 

    while (infile){ 
     drinks.push_back(DrinkT(name,atof(cost.c_str()),atoi(quantity.c_str()))); 

     std::getline(infile,name,','); 
     std::getline(infile,cost,','); 
     std::getline(infile,quantity,' '); 
    } 


    //output 
    for(DrinkT drink : drinks){ 
     std::cout << drink.name << " " << drink.cost << " " << drink.quantity << std::endl; 
    } 

    return EXIT_SUCCESS; 
} 

。使用言語機能のいくつかのCPP

情報:
http://www.cplusplus.com/reference/string/getline/
http://www.cplusplus.com/reference/stl/vector/

3
一部で

(間違いなくすべてではない)の方法は、私のアドバイスは、@ Xploitのとほぼ同じです。

struct soft_drink { 
    std::string name; 
    double price; 
    int quantity; 
}; 

その後(主な違い)私は、そのクラス/構造体のためoperator>>を定義したい::

std::istream &operator>>(std::istream &is, soft_drink &s) { 
    // this will read *one* "record" from the file: 

    // first read the raw data: 
    std::string raw_data; 
    std::getline(raw_data, is); 
    if (!is) 
     return is; // if we failed to read raw data, just return.   

    // then split it into fields: 
    std::istringstream buffer(raw_data); 

    std::string name; 
    std::getline(buffer, name, ','); 

    double price = 0.0; 
    buffer >> price; 
    buffer.ignore(1, ','); 

    int quantity = 0; 
    buffer >> quantity; 

    // Check whether conversion succeeded. We'll assume a price or quantity 
    // of 0 is invalid: 
    if (price == 0.0 || quantity = 0) 
     is.setstate(std::ios::failbit); 

    // Since we got valid data, put it into the destination: 
    s.name = name; 
    s.price = price; 
    s.quantity = quantity; 
    return is; 
} 
(ご希望の場合、またはクラス)私は、データを保持する構造体を定義することによって開始します

これにより、入力ストリームから1つのレコードを読み込み、変換が成功したかどうかを知ることができます。 1つのレコードを読み込むコードがあれば、残りの部分はほとんど問題なくなります。正しいタイプのistream_iteratorを使用してデータのベクトルを初期化するだけです。

// read the data in one big gulp (sorry, couldn't resist). 
// 
std::vector<soft_drink> drink_data((std::istream_iterator<soft_drink>(infile)), 
            std::istream_iterator<soft_drink>()); 
+0

すごいおっぱい、ハハ!私はちょうどこれが初心者であり、彼が宿題に取り組んでいる場合、これのいくつかがあまりにも複雑かどうか疑問に思います。 – Joe

関連する問題