следующий предложенный код:
- без ошибок компилируется
- правильно проверяет наличие ошибок
- правильно определяет структуру для чтения / записи в файл на диске
- изменено, когда определены прототипы функций
Примечание: я включил заголовочный файл в основной код, что вы, вероятно, не хотите делать.
А теперь,предлагаемый код:
#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);
}