fwrite терпит неудачу, не знаю почему - PullRequest
0 голосов
/ 14 апреля 2011

В моем коде ниже файл пишется правильно, насколько я могу судить.Когда я смотрю в файл 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 ]

7 голосов
/ 14 апреля 2011
  • Вы не работаете с текстовыми данными, поэтому вы должны указать двоичный режим при открытии файла.Используйте r+b вместо r+
  • . Вам необходимо fseek(binaryFile, 0, SEEK_SET), чтобы «перемотать» файл после записи.rewind также может использоваться для этого случая - fseek позволяет вам позиционировать указатель чтения / записи в любом месте.
1 голос
/ 14 апреля 2011

Вы забыли перемотать свой файл перед прочтением:

rewind(binaryFile);
1 голос
/ 14 апреля 2011

Структура FILE хранит запись о том, где в файле он указывает в данный момент. Поскольку вы только что написали в binaryFile, указатель файла находится на конце того, что вы написали.

Поэтому вам нужно перемотать файл, используя fseek(binaryFile, 0, SEEK_SET);, прежде чем читать.

0 голосов
/ 14 апреля 2011

Когда вы закончите запись в файл, указатель FILE будет в конце, поэтому, конечно, если вы попытаетесь прочитать его, он не будет работать.Попробуйте использовать fseek для перемещения указателя на начало файла перед чтением.

Пожалуйста, избегайте этого:

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

и предпочитайте это:

binaryFile = fopen(binaryFileName, "rb+");
if(!binaryFile) {
...