1

私たちの教授は私たちにこの割り当てを与えました、そこで私たち.txtは次のフォーマットのファイルを持っています:

John 23
Mary 56
Kyle 99
Gary 100
...etc. etc.

ファイルを読み取り、名前とスコアを並列配列に格納する必要があります。

これは、私が予想していたよりも少し難しいことがわかりました。スタックを検索するときに私を混乱させるのは、人々がこれを行うために使用するすべての異なるライブラリです。私たちの教授は、、、を使用してこれを実行することを望んstringfstreamsstreamます。

以下は私がこれまでに思いついたものです。それは完全にコンパイルされ、名前からスコアを分割しますが、それらを同じ配列に格納します。

#include <string>
#include <sstream>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
  const int SIZE = 50;
  string names[SIZE];
  int score [SIZE];
  short loop = 0;
  string line;

  ifstream inFile("winners.txt");

  if (inFile.is_open())
  {
    while(!inFile.eof())
    {
       istream& getline(inFile >> line);
       names[loop] = line;
       cout << names[loop] << endl;
       loop++;
    }
    inFile.close();
  }

  else cout << "Can't open the file" << endl;

  return 0;
}

私は自分のハードウェアの問題を解決する人を探していません。正しい方向にプッシュしたいだけです!

4

3 に答える 3

1

入力の各行について2つのことを読みたい場合は、次の2つの「read」ステートメントを使用するのが妥当と思われます。

std::string name;
inFile >> name;

int score;
inFile >> score;

std::cout << "Read score " << score << " for name " << name << '\n';

...その後、ファイル全体を読み取るまで、これを繰り返し実行できます。


編集:基本的なロジックを理解した後、エラー処理について検討することをお勧めします。たとえば、入力ファイルに50ペアの(名前、スコア)が含まれていない場合、プログラムの適切な動作は何ですか?その動作を実現するためにコードをどのように変更できますか?

于 2012-05-19T19:39:52.617 に答える
0

ファイルの各行は、空白で区切られた名前とスコアで構成されます。あなたは各行を読んでいますが、それをその部分(名前とスコア)に分割していません。

于 2012-05-19T19:37:16.540 に答える
0

これにはベクトルを使用するのが理想的ですが、配列を使用するように求められたように思われるため、配列を使用します。あなたがエントリーを読み始めるまで、あなたが上に持っているものはよさそうです。これを実現するためのより慣用的な方法は、std::getlineを使用することです。

ifstream inFile( "winners.txt" );
std::string line;

while( std::getline( inFile, line )) {
  // Do work here.
}

ループ内では、スペースの線を分割する必要があります。問題を解決せずに、文字列クラスのfind関数とsubstr関数を確認することをお勧めします:ここ。彼らはあなたが問題を解決するために必要なすべてをあなたに与えるでしょう。

于 2012-05-19T19:38:27.290 に答える