У меня есть задание прочитать файл ( datain.txt ), преобразовать его в двоичный файл и, наконец, снова прочитать двоичный файл, чтобы распечатать информацию в этом файле.
Я много раз пытался отладить свой код и обнаружил, что ошибка возникает в функции convertfile
. Для подробностей указатель файла datain
не перемещается, а просто читает первую строку. Я думаю, что fscanf
перемещает указатель, но это ложно в этом случае. Поэтому данные динамической памяти c памяти input
не изменяются вообще.
-> Вывод:
0 0 0 0
Ввод файла, который я использую:
1 JoeyMathel 0385788060 joeymathel@gmail.com
2 ScottyJack 0325621458 scottyjack@gmail.com
3 JohnMarker 0230125214 johnmarker@gmail.com
4 KarlKarper 0213020352 karlkarper@gmail.com
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXWORD 100
typedef struct address address;
struct address
{
int stt;
char name[100], telephone_number[20], email[100];
};
bool checktoread(FILE *in)
{
return in == NULL;
}
void inputdata(FILE *datain, int max, address *array)
{
while(fread(array, sizeof(address), max, datain)>0);
}
void convertfile(FILE *datain, FILE *dataout, int max)
{
address *input = (address *)malloc(sizeof(address)*max);
int size = sizeof(address);
int i = 0;
while (i<max)
{
fscanf(datain, "%d", &input[i].stt);
fscanf(datain, "%s", input[i].name);
fscanf(datain, "%s", input[i].telephone_number);
fscanf(datain, "%s\n", input[i].email);
i++;
}
fwrite(input, size, max, dataout);
free(input);
}
void printout(address *directory, int max)
{
int i = 0;
for (; i < max; i++)
printf("%-4d%-20s%-20s%-30s\n", directory[i].stt, directory[i].name, directory[i].telephone_number, directory[i].email);
}
int countline(FILE *in)
{
int i = 0;
char string[100];
while(fgets(string, 100, in)!= NULL)
i++;
return i;
}
int main()
{
FILE *fpin = fopen("datain.txt", "r");
FILE *fpout = fopen("phonebook.dat", "rb+");
int max = countline(fpin);
rewind(fpin);
address *directory = (address *)malloc(sizeof(address)*max);
if (checktoread(fpin))
{
printf("This file is empty or unable to be opened\n");
exit(1);
}
convertfile(fpin, fpout, max);
rewind(fpin);
rewind(fpout);
fclose(fpin);
inputdata(fpout, max, directory);
printout(directory, max);
fclose(fpout);
free(directory);
return 0;
}
```