1

次のように C++ でファイルを読み込んでいる場合:

//Begin to read a file
  FILE *f = fopen("vids/18.dat", "rb");
  fseek(f, 0, SEEK_END);
  long pos = ftell(f);
  fseek(f, 0, SEEK_SET);

  char *m_sendingStream = (char*)malloc(pos);
  fread(m_sendingStream, pos, 1, f);
  fclose(f);
  //Finish reading a file

最初に 2 つの質問があります。これはファイル全体を読み取っていますか? (そうしてほしい)そして2番目に、ファイルの最後に到達するまで続くwhileを作成するにはどうすればよいですか?私は持っている:

while(i < sizeof(m_sendingStream))

しかし、これが機能するかどうかはわかりません。私は読んでいて(以前にC ++でプログラミングしたことはありません)、使用できると思ってeof()いましたが、明らかにそれは悪い習慣です。

4

2 に答える 2

2

ファイルから読み取る場合、ループは必要ありません。これは、コードの内容全体を一度に取得できるためです。もちろん、戻り値を記録して確認する必要があります。

size_t const n = fread(buf, pos /*bytes in a record*/, 1 /*max number of records to read*/, f);

if (n != 1) { /* error! */ }

また、事前にファイル サイズを知らなくても、ファイルの最後まで読み取るループを作成することもできます (たとえば、パイプまたは成長するファイルから読み取る)。

#define CHUNKSIZE 65536
char * buf = malloc(CHUNKSIZE);
{
   size_t n = 0, r = 0;

   while ((r = fread(buf + n, 1 /*bytes in a record*/, CHUNKSIZE /*max records*/, f)) != 0)
   {
      n += r;

      char * tmp = realloc(buf, n + CHUNKSIZE);

      if (tmp) { buf = tmp; }
      else     { /* big fatal error */ }
   }

   if (!feof(f))
   {
      perror("Error reading file");
   }
}
于 2012-11-25T23:55:03.603 に答える
1

これは C スタイルのファイル操作で、C++ スタイルではfstreamライブラリを使用します。

2 番目の質問については、ファイルの最後にいるかどうかを確認する良い方法は、feof関数を使用することです。

于 2012-11-26T00:00:54.733 に答える