0

クラス構造と getline() 関数を使用してテキスト ファイル データを列に表示し、テキスト ファイルを読み取り、データをベクター クラスにダンプしようとしています。しかし、プログラムは「while」ループまで実行されず、プログラムを終了したようです。テキストファイルが空ではありません。

以下は私のコードです:

void ScrambleWordGame::displayScoreChart() {
//open file
fstream readScoreChart("ScoreChart.txt");
string line = "";

//vector to store data in
vector<personResult> perResult;
personResult person;

//while file is open, do stuff
if(readScoreChart.is_open())
{
    //check through the file
    readScoreChart.seekp(0,ios::end);
    //get the size of the file's data
    size_t size = readScoreChart.tellg();
    if(size == 0)
        cout << "No results yet. Please TRY to win a game. AT LEAST~" << endl;
    else
    {
        //create the 1st row with 4 column names
        cout << left
            << setw(20) << "Player Name "
            << setw(20) << "Winning Time "
            << setw(20) << "No. Of Attempts "
            << setw(20) << "Game Level " << endl;
        //fill the second line with dashes(create underline)
        cout << setw(70) << setfill('-') << "-" << endl;
        //read the file line by line
        //push the 1st line data into 'line'
        cout << getline(readScoreChart,line);
        while(getline(readScoreChart,line))
        {
            //create stringstream n push in the entire line in
            stringstream lineStream(line);

            //reads the stringstream and dump the data seperated by delimiter
            getline(lineStream,person.playerName,':');
            getline(lineStream,person.winningTime,':');
            getline(lineStream,person.noOfAttempts,':');
            getline(lineStream,person.gameLvl);

            //sort the results based on their timing
            //sort(perResult.begin(),perResult.end(),pRes);
            //display the results
            cout << left
                    << setfill(' ')
                    << setw(25) << person.playerName
                    << setw(22) << person.winningTime
                    << setw(17) << person.noOfAttempts
                    << setw(16) << person.gameLvl
                    << endl;
        }
    }
}
readScoreChart.close();

}

編集: TextFile の例
Joel:3:1:1
Mary:5:2:2
John:25:3:1

4

2 に答える 2

2

最初のシークの後、ファイル ポインタはファイルの最後にあります。ファイルの先頭に再配置する必要があります。

if(size == 0)
{
    cout << "No results yet. Please TRY to win a game. AT LEAST~" << endl;
}
else
{
    readScoreChart.seekp(0,ios::begin);
    // all you other stuff
}
于 2013-07-17T06:58:43.013 に答える
1

読み取ることができるようにするには、ファイルの先頭に戻る必要があります。さらに良いことに、そもそも最後まで求めないでください。

コードを少し再構成します。operator>>ファイルからレコードを読み取る と、レコードをファイルoperator<<に書き込む を記述します。

class person {
    std::string name;
    std::string winning_time;
    std::string num_attempts;
    std::string level;

 public:
    bool operator<(person const &other) const { 
        return std::stoi(winning_time) < std::stoi(other.winning_time);
    }

    friend std::istream &operator>>(std::istream &in, person &p) { 
            std::string buffer;
            std::getline(in, buffer);
            std::istringstream is(buffer);

            std::getline(is,p.name,':');
            std::getline(is,p.winning_time,':');
            std::getline(is,p.num_attempts,':');
            std::getline(is,p.level);
            return in;
    }

    friend std::ostream &operator<<(std::ostream &os, person const &p) { 
             return os << std::setw(25) << p.name
                       << std::setw(22) << p.winning_time
                       << std::setw(17) << p.num_attempts
                       << std::setw(16) << p.level;
    }

};

これらが整っていれば、残りはかなり簡単になります。

void show_header(std::ostream &os) { 
    cout << left
        << setw(20) << "Player Name "
        << setw(20) << "Winning Time "
        << setw(20) << "No. Of Attempts "
        << setw(20) << "Game Level " << "\n";
    std::cout << std::string(70, '-');
}

 void game::displayScoreChart(){ 
    std::ifstream in("ScoreChart.txt");

    // read the data:
    std::vector<person> people{std::istream_iterator<person>(in),
                               std::istream_iterator<person>()};

   if (people.empty()) {
       std::cout << "No scores yet."
       return;
   }

   // sort it by winning time:
   std::sort(people.begin(), people.end());

   show_header(std::cout);

   // display it:
   for (auto const &p : people) 
       std::cout << p << "\n";
   return 0;
}

C++11 コンパイラがない場合の簡単な置き換えとして、 anは次のstoiように記述できます。

int stoi(std::string in) { 
     return strtol(in.c_str(), NULL, 10);
}
于 2013-07-17T07:06:10.920 に答える