Файловый ввод-вывод в языке Си
Вопрос:Выдаёт бесконечные нули при запуске программы, где и в чём может быть проблема, никак не могу понять где же я накосячил... ?
Структура с именем TRAIN, с полями пункта назначения,номером поезда и врменем.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
struct TRAIN
{
char punkt[30];
char time[30];
int num;
};
typedef struct TRAIN TRAIN;
TRAIN* read(char *name, int *n)
{
FILE *fp;
if ((fp = fopen(name, "rb")) == NULL)
{
printf("%s", strerror(errno));
exit(0);
}
fscanf(fp,"%d", n);
TRAIN *way = (TRAIN *)malloc(sizeof(TRAIN) * *n);
for (int i = 0; i < *n; i++)
{
fscanf(fp,"%s %s %d\n",way[i].punkt , way[i].time, &way[i].num);
}
fclose(fp);
return way;
}
void print(TRAIN *way , int *n)
{
for (int i = 0; i < *n; i++)
{
printf("%s %s %d\n", way[i].punkt, way[i].time, way[i].num);
}
}
void write(char *name, int *n, TRAIN *way)
{
FILE *fp;
if ((fp = fopen(name, "wb")) == NULL)
{
printf("%s", strerror(errno));
exit(0);
}
fprintf(fp, "%d\n", *n);
for (int i = 0; i < *n; i++)
{
fprintf(fp, "%s %s %d\n", way[i].punkt, way[i].time, way[i].num);
}
fclose(fp);
}
TRAIN* read_p(char *name, int *n, int *e)
{
FILE *fp;
if ((fp=fopen(name, "rb")) == NULL)
{
printf("%s", strerror(errno));
exit(0);
}
fscanf(fp, "%d", n);
TRAIN *way = (TRAIN *)malloc(sizeof(TRAIN) * *n);
char p[30];
printf("punkt, time, num\n");
printf("Введите данные: \n");
scanf("%s", p);
for (int i = 0; i < *n; i++)
{
char n1[30];
char n2[30];
int num;
fscanf(fp, "%s %s %d", n1, n2, &num);
if (strcmp(p, "punkt") == 0)
{
strcpy(way[i].punkt, n1);
strcpy(way[i].time, "null");
printf("%s\n", way[i].punkt);
}
else if (strcmp(p, "time") == 0)
{
strcpy(way[i].punkt, "null");
strcpy(way[i].time, n2);
printf("%s\n", way[i].time);
}
else if (strcmp(p, "num") == 0)
{
strcpy(way[i].punkt, "null");
strcpy(way[i].time, "null");
way[i].num=num;
printf("%d\n", way[i].num);
}
else
{
strcpy(way[i].punkt, "null");
strcpy(way[i].time, "null");
*e=1;
}
}
fclose(fp);
return way;
}
char* read_number(char *name)
{
FILE *fp;
if ((fp = fopen(name, "rb")) == NULL)
{
printf("%s", strerror(errno));
return "false";
}
int n;
fscanf(fp, "%d", &n);
TRAIN *way = (TRAIN *)malloc(sizeof(TRAIN) * n);
int p;
printf("Введите номер: \n");
scanf("%d", &p);
p=p-1;
int e=1;
for (int i = 0; i < n; i++)
{
char n1[30];
char n2[30];
int num;
fscanf(fp, "%s %s %d", n1, n2, &num);
if (i==p)
{
strcpy(way[i].punkt, n1);
strcpy(way[i].time, n2);
way[i].num=num;
e=0;
printf("%s %s %d\n", way[i].punkt, way[i].time, way[i].num);
}
else
{
strcpy(way[i].punkt, "null");
strcpy(way[i].time, "null");
way[i].num=0;
}
}
fclose(fp);
// print(way, &n);
free(way);
if (e == 0)
{
return "true";
}
else
{
return "false";
}
}
int main ()
{
int n, e;
e=0;
char *name_read = "structures.txt";
char *name_write = "train.txt";
TRAIN *way = read(name_read, &n);
print(way, &n);
write(name_write, &n, way);
int n1;
TRAIN *par = read_p(name_read, &n1, &e);
if (e==1)
{
printf("Неверные данны\n");
}
printf("%s\n", read_number(name_read));
free(way);
free(par);
return 0;
}
