Как мне прочитать массив или переменную, которые хранятся в двоичном файле, и распечатать их в программе? - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблемы с получением значений переменных / элементов из файла, записанного в другой программе c, для сохранения в переменных / элементах выполняющейся программы c.Я продолжаю получать ошибки сегментации при чтении переменной "i" в программу (которая является целым числом, которое уже определено и сохранено в файле "inventory.txt").«i» представляет количество элементов (размер) печатаемых массивов.Вот сломанный код):.

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

int main()
{
    int l, k;
    int *pn, *arraysize, *q;
    float *p;
    FILE *fp = fopen( "inventory.txt", "r+b" ); //declarations and I open up the binary file "inventory.txt"

    if ( fp == NULL )
    {                           //check file
        printf( "nah" );
        exit( EXIT_FAILURE );
    }

    *arraysize = fread( &arraysize, sizeof( int ), 1, fp );     //set arraysize in this program equal to i in the binary file inventory.txt?????? Here is where I get segmentation fault

    printf( "marker1" );        //place marker, I am not getting to this point when running the program

    for ( l = 0; l < *arraysize; l++ )
    {
        q[l] = fread( &q[l], sizeof( int ), arraysize, fp );    //set array elements ("arraysize" of them) pn, q, and p to the array elements of the same name in binary file inventory.txt
        p[l] = fread( &p[l], sizeof( int ), arraysize, fp );
        pn[l] = fread( &pn[l], sizeof( int ), arraysize, fp );
    }

    printf( "Below are the items in your inventory.\nPart#\tQuantity\tPrice\n" );       //print out the values
    for ( l = 0; l < *arraysize; l++ )
    {
        printf( "%5d\t", pn[l] );
        printf( "%8d\t", q[l] );
        printf( "%9.2f\n", p[l] );
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Ваши указатели немного ошибочны, код никогда не выделял памяти для чтения значений, а fread() возвращает количество прочитанных элементов, код (по какой-то причине) перезаписывает только что прочитанное значение с этим результатом.

Вот исправленная версия, но вы не включаете тестовые данные, поэтому она не проверена.

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

int main(  )
{
    int    l;
    int   *pn;
    int   *q;
    float *p;
    int    arraysize;

    FILE *fp = fopen( "inventory.txt", "r+b" ); //declarations and I open up the binary file "inventory.txt"

    if ( fp == NULL )
    {                           //check file
        printf( "nah" );
        exit( EXIT_FAILURE );
    }

    fread( &arraysize, sizeof( int ), 1, fp );     //set arraysize in this program equal to i in the binary file inventory.txt?????? Here is where I get segmentation fault

    printf( "marker1" );        //place marker, I am not getting to this point when running the program


    // Allocate some memory to hold the data (Yes! With cast on malloc())
    q  = (int *)malloc(arraysize * sizeof( int ));  // TODO - check malloc() OK
    pn = (int *)malloc(arraysize * sizeof( int ));  // TODO - check malloc() OK
    p  = (float *)malloc(arraysize * sizeof( float ));  // TODO - check malloc() OK

    // read each entire block in a single operation
    fread( q, sizeof( int ), arraysize, fp );    //set array elements ("arraysize" of them) pn, q, and p to the array elements of the same name in binary file inventory.txt
    fread( p, sizeof( float ), arraysize, fp );
    fread( pn, sizeof( int ), arraysize, fp );


    printf( "Below are the items in your inventory.\nPart#\tQuantity\tPrice\n" );       //print out the values
    for ( l = 0; l < arraysize; l++ )
    {
        printf( "%5d\t", pn[l] );
        printf( "%8d\t", q[l] );
        printf( "%9.2f\n", p[l] );
    }
    return 0;
}
0 голосов
/ 12 декабря 2018

Итак, вот ваш код:

int *arraysize;
*arraysize=fread(&arraysize,sizeof(int),1,fp);

вы объявляете arraysize как int * (указатель), но затем вы пытаетесь вставить в него int.Это не имеет никакого смысла.Затем вы пытаетесь разыменовать его, чтобы сохранить возвращаемое значение, что приводит к сбою, поскольку он не является действительным указателем.

Вы, вероятно, хотите

int arraysize;
if (fread(&arraysize, sizeof(int), 1, fp) != 1) {
    fprintf(stderr, "error reading file\n");
    exit(1); }

, объявляя arraysize как простое int (не указатель) и чтение в него.

У вас есть аналогичные проблемы с вашими другими вызовами Fread.

...