Перечитывание структуры на С - PullRequest
0 голосов
/ 11 декабря 2018

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

  1. запись структуры в файл (правильно)
  2. чтение структуры из файла (правильно)
  3. закрыть приложение
  4. чтение структуры из файла (неверно)
  5. Элемент списка

Процесс завершен со статусом -1073741819 (0 минут (s), 6 секунд (ы)

Мой код: logika.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "logika.h"
int write_struc(char *PF, char *DF, char *TF, char *TL)
{
    struct MYSTR myStruct ={PF, DF, TF, TL};
    FILE* fb;
    if ((fb=fopen(PLIK_DAT, "a"))!=NULL)
    {
        fwrite(&myStruct, sizeof(struct MYSTR), 1, fb);
        fclose(fb);
        return 1;
    }
    else
    {
        return 0;
    }
}

void read_struc()
{
    FILE* fb;
    struct MYSTR myStruct;
    fb = fopen(PLIK_DAT, "r");
    while(1) {
        fread(&myStruct,sizeof(struct MYSTR),1,fb);
        if(feof(fb)!=0)
            break;
        printf("%s",myStruct.PF);
        printf("%10s" ,myStruct.DF);
        printf("%10s" ,myStruct.TF);
        printf("%10s\n", myStruct.TL);
    }
    fclose(fb);
}

logic.h

#ifndef LOGIKA_H_INCLUDED
#define LOGIKA_H_INCLUDED
#define PLIK_DAT "baza.dat"
int write_struc(char *PF, char *DF, char *TF, char *TL);
struct MYSTR{
    char *PF;
    char *DF;
    char *TF;
    char *TL;
};
#endif // LOGIKA_H_INCLUDED

Я пробовал двоичную запись/ чтение и это не помогает.

Ответы [ 2 ]

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

следующий предложенный код:

  1. без ошибок компилируется
  2. правильно проверяет наличие ошибок
  3. правильно определяет структуру для чтения / записи в файл на диске
  4. изменено, когда определены прототипы функций

Примечание: я включил заголовочный файл в основной код, что вы, вероятно, не хотите делать.

А теперь,предлагаемый код:

#ifndef LOGIKA_H_INCLUDED
#define LOGIKA_H_INCLUDED

// prototypes
int write_struc(char *PF, char *DF, char *TF, char *TL);
void read_struc( void );

#define MAX_STRING_LEN 1024

struct MYSTR
{
    char PF[ MAX_STRING_LEN ];
    char DF[ MAX_STRING_LEN ];
    char TF[ MAX_STRING_LEN ];
    char TL[ MAX_STRING_LEN ];
};
#endif // LOGIKA_H_INCLUDED


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include "logika.h"

#define MAX_BUF_LEN 256
#define PLIK_DAT "baza.dat"

int write_struc(char *PF, char *DF, char *TF, char *TL)
{
    struct MYSTR myStruct;
    strncpy( myStruct.PF, PF, MAX_STRING_LEN );
    strncpy( myStruct.DF, DF, MAX_STRING_LEN );
    strncpy( myStruct.TF, TF, MAX_STRING_LEN );
    strncpy( myStruct.TL, TL, MAX_STRING_LEN );

    FILE* fb;
    if ( !(fb=fopen(PLIK_DAT, "a")))
    {
        char buffer[ MAX_BUF_LEN ];
        sprintf( buffer, "fopen to append to %s failed", PLIK_DAT );
        perror( buffer );
        return 0;
    }

    // implied else, fopen successful

    if(  fwrite(&myStruct, sizeof(struct MYSTR), 1, fb) != 1)
    {
        perror( "fwrite failed" );
        return 0;
    }

    // implied else, fwrite successful

    fclose(fb);
    return 1;
}


void read_struc()
{
    struct MYSTR myStruct;
    FILE* fb;
    if( !(fb = fopen(PLIK_DAT, "r") ) )
    {
        char buffer[ MAX_BUF_LEN ];
        sprintf( buffer, "fopen to read %s failed", PLIK_DAT );
        perror( buffer );
        exit( EXIT_FAILURE );  // if program can recover, then use `return;`  rather than `exit()`
    }

    // implied else, fopen successful

    while( fread(&myStruct,sizeof(struct MYSTR),1,fb) == 1)
    {
        printf("\n%s", myStruct.PF);
        printf("%s",   myStruct.DF);
        printf("%s",   myStruct.TF);
        printf("%s\n", myStruct.TL);
    }
    fclose(fb);
}
0 голосов
/ 11 декабря 2018

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

За одно выполнение вашей программы вам повезло, потому что данные по этим адресам не изменились, и похоже, что они сработали.Но это ничего не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...