3

これまでのところ、テキスト ファイルを配列に読み込むいくつかの方法を見つけ、それを画面に正常に表示することができました。私が問題を抱えているのは、そこから配列をソートする方法です。テキスト ファイルの並べ替えは簡単でしたが、両方を結合しようとするとうまくいきませんでした。これが私がこれまでに得たものです:

int main()
{
   string players[30];
   ifstream inData("chessplayers.txt");
   if (inData.is_open())
   {
     for (int i = 0; i < 30; i++)
     {
       sort( players, players+i);       
       if (getline(inData, players[i]))
       {        
         cout << players[i] << endl;
       }
       else
       {
         break;
       }
    }
    inData.close();
  }
  else
  {
    cerr << "Failed to open file.\n";
  }
  system("pause");    
  return 0;
}

誰かが私を正しい方向に向けるのを手伝ってくれますか? 私の課題は、テキストを配列に読み取ってから、その配列をソートできるようにすることです。

4

2 に答える 2

1

さまざまなアクションを関数に分割することをお勧めします。これにより、コードがよりクリーンになり、読みやすくなり、モジュール化されます。

たとえば、この問題では、データをファイルに読み込む、並べ替える、印刷するという3つの異なることが起こっています。データを読み込んで印刷する独自の関数を作成します。ソートする関数がすでにあることを知っているので、それを使用してください。

これは、「許可」されていない可能性のある手法を使用する例(C ++ 11を少し使用)ですが、独自のコードで何を変更する必要があるかを学ぶための良い出発点になります。

主に、コードは自己文書化されていることに注意してください。ファイルからプレーヤーを読み取り、並べ替えてから印刷するように指示されています。

#include <algorithm>
#include <deque>
#include <fstream>
#include <iostream>
#include <string>

typedef std::deque<std::string> PlayerContainer;

PlayerContainer getPlayersFromFile(std::string filename)
{
  PlayerContainer players;

  std::ifstream ifs(filename.c_str());

  std::string player;
  while (getline(ifs, player))
    players.push_back(player);

  return players;
}

void printPlayers(PlayerContainer const& players)
{
  // (this is the only part that depends on C++11)
  // for each player in players
  for (auto const& player : players)
    std::cout << player << '\n';
}

int main()
{

  std::string filename("chessplayers.txt");

  PlayerContainer players = getPlayersFromFile(filename);

  sort(players.begin(), players.end());

  printPlayers(players);
}
于 2012-05-10T22:42:40.427 に答える
0

データの読み取り中にソートしないでください。ソート関数を読み取りの外に置きます。

sort(players、players + 30);

また、オーバーロードすることについて疑問がある場合は、std :: stringに、独自のオーバーロードされた<、>、=などを指定してください。

于 2012-05-10T22:39:31.610 に答える