0

次のように、ファイルからテキストを読み取るためのコード例に出くわしました。

int i; 
char *fileName = "text.txt"; 
ifstream fin(fileName); 

while (fin >> i)
{
do something;
}

このコードは実際にスペースで区切られたテキストを開いて読み取りますが、その仕組みがわかりません。「open」または「read」コマンドなしでファイルを開くにはどうすればよいですか? ファイルの先頭に巻き戻す方法はありますか? 動的に割り当てられた配列を作成しようとしていますが、スコアの数をファイルでカウントするまで方法がわかりません。

4

2 に答える 2

0

ファイルは、std::ifstreamクラスのコンストラクターによって開かれます。

を使用fin.seekg(std::ios::beg);してファイルを巻き戻すこともできますが、たとえば、要素の数を事前に知る必要なく、新しい要素をプッシュするために使用できる astd::vectorまたはstd::listwhere を使用することをお勧めします。push_back()

ただし、宿題では、手動で割り当てられた配列とポインターを使用する必要があるように見えるため、次のようなものでうまくいきます。

#include <fstream>
#include <iostream>
#include <iterator>

int main()
{
  std::ifstream fin("text.txt");
  size_t n = 0;
  int i;
  for (; fin >> i; ++n);
  fin.clear();
  fin.seekg(0, std::ios::beg);
  int *scores = new int[n];
  std::istream_iterator<int> first(fin), last;
  std::copy(first, last, scores);

  std::copy(scores, scores+n, std::ostream_iterator<int>(std::cout, " "));
  std::cout << "\n";
  delete[] scores;
}
于 2012-04-19T08:13:26.603 に答える
0

「open」または「read」コマンドなしでファイルを開くにはどうすればよいですか?

ifstreamコンストラクターはファイルを開きます。

ファイルの先頭に巻き戻す方法はありますか?

を使用しseekg()ます。EOF に達した場合は、 を呼び出すclear()前に を呼び出す必要がありますseekg()

動的に割り当てられた配列を作成しようとしています

許可されている場合は、std::vector読み取ったテキストを保存するために使用できます。これにより、ファイルの内容を 2 回読み取る必要がなくなります。

于 2012-04-19T07:56:55.393 に答える