1

私は言語を練習するプログラムを書いていますが、私には正しいと思われるコードからかなり奇妙な出力が得られます。

コード:

#include <iostream>
#include <fstream>
#include <list>
struct Car
{
    std::string make;
    std::string model;
    int partNo;
    double price;
    int quantity;
    std::string partname;
};
void AddItem();
void _Update(int PartNo, int quantity);
void UpdateList(std::list<Car>& _Car);
int main()
{
    std::list<Car> _Car;
    UpdateList(_Car);
    for(std::list<Car>::iterator iter = _Car.begin(); iter != _Car.end(); iter++)
     {
         std::cout << iter->make << " " << iter->model << " " << iter->partNo << " " << iter->price << " " << iter->quantity << " " << iter->partname << std::endl;
     }
}

void UpdateList(std::list<Car>& _Car)
{
    std::ifstream File("CarParts.txt");
    if(!File.is_open())
        std::cerr << "Bad file input....... closing....";

    while(!File.eof())
    {
        Car tempObj;
        File >> tempObj.make >> tempObj.model >> tempObj.partNo >> tempObj.price >> tempObj.quantity;
        getline(File,tempObj.partname);
        _Car.push_back(tempObj);
    }
    File.close();

}

与えられた前哨地:

 Pajero NA1H25 1 3.65 11 BLADE W/S WIPER Honda_Sivic R34gFk 2 4.97 15
 ENGINE CHANGE    2 4.97 15

メモ帳ファイル:

Pajero NA1H25 1 3.65 11 BLADE W/S WIPER
HondaSivic R34gFk 2 4.97 15 ENGINE CHANGE

私が実際に印刷したかった2行の下の3つの数字は何ですか? それは本当に私を混乱させます...助けていただければありがとうございます!

4

2 に答える 2

2

これは、C++ でファイル データを読み取るときに遭遇する一般的な問題です。問題は、あなたの使い方ですeof。このフラグは、データの読み取りに失敗した後にのみ設定されます。

そのため、最初の 2 行を読み取った後も、まだファイルの最後に達していません。それまで読み取られましたが、eof設定されていません。次に、3 回目のループを繰り返し、2 行の読み取りを試み、その後終了します。eof問題は、その 3 番目のループの結果を車のリストにプッシュする前にチェックしないことです。

あなたの場合、eofチェックをgetline呼び出しの後に移動するか、getline戻り値を利用できます。

例えば:

while(true)
{
    Car tempObj;
    File >> tempObj.make >> tempObj.model >> tempObj.partNo
         >> tempObj.price >> tempObj.quantity;
    if (!getline(File,tempObj.partname)) break;
    _Car.push_back(tempObj);
}

これにより、プッシュする前にデータが正常に読み取られたかどうかがチェックされます。

于 2012-05-22T07:12:12.000 に答える
-3

手始めに、厄介な std::string などの構文を避けるために、プログラムの名前空間を std に設定します。

ファイルの上部近くのインポートの下に、次を挿入します。

ファイルからリストを作成することが目的のようです。

この部分を見ると:

 File >> tempObj.make >> tempObj.model >> tempObj.partNo >> tempObj.price >> tempObj.quantity;
 getline(File,tempObj.partname);

より良い解決策は、getLine を使用して各行を解析し、それに応じてスペース区切りまたはコンマでデータを解析することだと思います。空白の区切り文字は扱いにくい場合があります。

于 2012-05-22T05:02:43.740 に答える