Проблемы с файлами в C - PullRequest
       4

Проблемы с файлами в C

0 голосов
/ 21 ноября 2018

Я пытаюсь написать функции, которые помогут мне с сохранением и загрузкой файлов ... но когда я пытаюсь сохранить мой массив из файла, он не совпадает с исходным, который я загрузил в файл.Вот мой код.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

#include "intarr.h"

/* LAB 6 TASK 1 */

/*
  Save the entire array ia into a file called 'filename' in a binary
  file format that can be loaded by intarr_load_binary(). Returns
  zero on success, or a non-zero error code on failure. Arrays of
  length 0 should produce an output file containing an empty array.
*/

int intarr_save_binary( intarr_t* ia, const char* filename )
{
  FILE* f = fopen( "filename", "wb" );

  if( f == NULL )
  {
    return 1;
  }

  if( fwrite( &ia->len, sizeof( int ), 1, f ) != 1 )
  {
    return 1;
  }

  if( fwrite( &ia->data, sizeof( int ), ia->len, f ) != ia->len )
  {
    return 1;
  }

  fclose( f );

  return 0;
}

/*
  Load a new array from the file called 'filename', that was
  previously saved using intarr_save_binary(). Returns a pointer to a
  newly-allocated intarr_t on success, or NULL on failure.
*/

intarr_t* intarr_load_binary( const char* filename )
{
  if( filename == NULL )
  {
    return NULL;
  }

  FILE* f = fopen( "filename", "rb" );

  if( f == NULL )
  {
    return NULL;
  }

  int len;

  if( fread( &len, sizeof( int ), 1, f ) != 1 )
  {
    return NULL;
  }

  intarr_t* new_ia = intarr_create( len );

  fread( new_ia->data, sizeof( int ), len, f );

  fclose( f );

  return new_ia;
}

Также просто для ясности intarr_t ia - это просто структура с ia-> data (массив) и ia-> len (len массива)

1 Ответ

0 голосов
/ 21 ноября 2018

В этой строке вы пишете содержимое указателя, а не данные, на которые он указывает.Если длина достаточна, вы можете написать другие случайные данные, следующие за ней, с учетом неопределенного поведения :

fwrite( &ia->data, sizeof( int ), ia->len, f )

Проблема в том, что вы добавили один дополнительный уровень перенаправления с помощьювзяв адрес ia->data.Кажется, у вас просто была ошибка копирования-вставки или что-то в этом роде.Удалить &:

fwrite( ia->data, sizeof( int ), ia->len, f )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...