2

ファイルからさまざまなコンテナーにデータをインポートする必要があるプログラムを作成しています。すべてを適切にインポートしていますが、eof であるはずの後に読み取りを続けています。いつ終了するかをループに適切に伝えていない気がしますが、コードは以下に示しています。

bool InitLoad(vector<string>&num, vector<string>&name, vector<double>&price, vector<char>&tax)
{
    ifstream invFile;
    int intTemp;
    string strTemp;
    double dubTemp;
    char chTemp;
    string fileLoc = "C:/Users/owner/Documents/Visual Studio 2010/Projects/CISS 350/Week 1 Grocery Register/Week 1 Grocery Register/Invent.dat";

    //Open Invent.dat file. Location below is the location used on creators computer. Other may need to modify file location
    invFile.open(fileLoc.c_str(), ios::in);

    //If Invent.dat file fails to open display error message and return false
    if(invFile.fail())
    {
        cout << "Could not open inventory file" << endl;
        return false;
    }
    if(invFile)
    {
        //Read first line of the file
        getline(invFile, strTemp, ' ');
        while(invFile)  //while invFile contains data display import the list
        {
            cout << strTemp << " ";
            num.push_back(strTemp);

            getline(invFile, strTemp, ' ');
            cout << strTemp << " ";
            name.push_back(strTemp);

            getline(invFile, strTemp, ' ');
            dubTemp = atof(strTemp.c_str());
            cout << dubTemp << " ";
            price.push_back(dubTemp);

            invFile.get(chTemp);
            cout << chTemp;
            tax.push_back(chTemp);

            getline(invFile, strTemp, ' ');
        }
    }

    invFile.close();

    cout << endl;
    //Verify Proper input...REMOVE WHEN COMPLETE
    cout << "Verifying input data correct..." << endl;
    int vecSize = num.size();
    cout << vecSize << endl;
    for(int i = 0; i < vecSize; i++)
    {
        cout << num[i] << " " << name[i] << " " << price[i] << " " << tax[i] << endl;
    }

}
4

2 に答える 2

4

あなたのチェックは eof フラグをチェックしません http://www.cplusplus.com/reference/ios/ios/operator_bool/

invFile.eof()代わりに使用

また、過去のEOFを読み取った後にeofフラグが設定されます

PS: OMG !! 使用しないatofでください。invFile << dubTemp

于 2013-03-26T16:32:34.497 に答える
0

データはスペースで区切られているため、すべての文字列で getline() の代わりにフォーマットされた入力を使用できます。これに沿った何か。

 string lineTemp;
 while(getline(invFile, lineTemp))  //while invFile contains data display import the list
    {
        string strTemp1, strTemp1, dubTemp, chTemp;
        istringstream lstr(lineTemp);

        if(lstr >> strTemp1 >> strTemp2 >> dubTemp >> chTemp) {

            num.push_back(strTemp1);
            name.push_back(strTemp2);
            price.push_back(dubTemp);
            tax.push_back(chTemp);


            cout << strTemp1 << " "
                 << strTemp2 << " "
                 << dubTemp << " "
                 << chTemp << endl;
         }

         else {
             // Something is wrong with the line format.
         }


    }

これにより、データがフォーマットされた方法で適切なタイプに読み取られます。さらに、空行や行内の余分な文字について心配する必要はありません。

于 2013-03-26T16:53:34.800 に答える