Невозможно преобразовать текстовый файл в двоичный файл - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть задание прочитать файл ( 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;
}
```
...