0

以下の私のコードでは、私が知る限り、ファイルは正しく書き込まれています。ファイル floats.dat を見ると、このバイナリ ストリームが表示されます。ÍÌL@33c@ÍÌÜ@ffFAßOeA^@^@bBf6zE33äCff<83>BÍ̦B

ただし、私のプログラムは常にこの if ステートメントをトリガーします。

if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH)
{
   fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName);
   return EXIT_FAILURE;
}

ここで私が間違ったことを誰かが見ていますか?以下の完全なコード。

#include <stdlib.h>
#include <stdio.h>
#define LENGTH 10

int main(void)
{
   FILE *binaryFile, *textFile;
   char *binaryFileName = "floats.dat", *textFileName = "floats.txt";
   float floats[LENGTH] = {3.2, 3.55, 6.9, 12.4, 14.332, 56.5, 4003.4, 456.4, 65.7, 83.4};
   float inputFloats[LENGTH];
   int i;

   if((binaryFile = fopen(binaryFileName, "r+")) == NULL)
   {
      fprintf(stderr, "Problem opening %s", binaryFileName);
   }

   if(fwrite(floats, sizeof(float), LENGTH, binaryFile) < LENGTH)
   {
      fprintf(stderr, "Problem writing some or all data to %s\n", binaryFileName);
      return EXIT_FAILURE;
   }

   printf("DATA WRITTEN SUCCESSFULLY\n");

   if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH)
   {
      fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName);
      return EXIT_FAILURE;
   }

   for(i = 0; i < LENGTH; i++)
   {
      printf("float[%d] = %f\n", i, floats[i]);
   }

   return EXIT_SUCCESS;
}
4

4 に答える 4

7
  • テキスト データを扱っていないため、ファイルを開くときにバイナリ モードを指定する必要があります。r+bの代わりに使用r+
  • fseek(binaryFile, 0, SEEK_SET)書き込み後にファイルを「巻き戻す」必要があります。rewindこの場合にも使用fseekできます。読み取り/書き込みポインターを好きな場所に配置できます。
于 2011-04-14T13:26:44.910 に答える
1

このFILE構造体は、現在指しているファイル内の場所を記録します。に書き込んだばかりなのでbinaryFile、ファイル ポインタは書き込んだものの末尾にあります。

したがって、読む前に を使用して、ファイルを巻き戻す必要がありますfseek(binaryFile, 0, SEEK_SET);

于 2011-04-14T13:28:27.100 に答える
1

ファイルを読む前に巻き戻すのを忘れました:

rewind(binaryFile);
于 2011-04-14T13:30:38.033 に答える
0

ファイルへの書き込みが完了すると、FILE ポインターはファイルの末尾にあるため、当然、読み取ろうとしても機能しません。を使用fseekして、ポインタをファイルの先頭に移動してから読み取ってください。

これを避けてください:

if((binaryFile = fopen(binaryFileName, "r+")) == NULL) {

そしてこれを好む:

binaryFile = fopen(binaryFileName, "rb+");
if(!binaryFile) {
于 2011-04-14T13:28:48.177 に答える