Почему коряво заполняется структура? или коряво выводит?

помогите пожалуйста разобраться, почему выводит название улицы два раза в первой строке. Аннотация. В общем есть файл .DAT (бд с фио, улица, дом, кв, дата), пытаюсь его закинуть в аналогичную структуру. Первый способ: через fread, в структуру заливается вроде нормально (тут еще проблема в том что в отладчике некорректно отображаются данные (иероглифы), не могу посмотреть что сохранилось в поле, это проблема я так понимаю из-за кодировок, ее тоже не знаю как решить), поэтому могу судить только по кол-ву символов, например фамилия_имя_отчество. Но выводится что попало, выводится одно и тоже несколько раз, в одной строке откуда-то появляются данные из другой строки, и номер дома и кв выводит то ли номером ячейки памяти то ли еще чем-то. На скрине Method one. Второй способ: топорный, прохожу fgetc по файлу, сохраняю во временный массив, из него заливаю в структуру. Уже лучше выводятся данные, но откуда берется второй раз улица в первой строке я не понимаю. Если выводить посимвольно, ее там нет, если %s то она появляется. Две структуры просто для примера. Ссылка на файл БД

Результат работы

Некорректное отображение в отладчике`

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <Windows.h>

FILE * fp;
char bp[255] = "";
int m = 0;

struct adres_book
{
    char fio[32];
    char street[20];
    unsigned int home;
    unsigned int flat;
    char date[8];
}book;

struct adres_book2
{
    char fio[32];
    char street[20];
    unsigned int home;
    unsigned int flat;
    char date[8];
}book2;

void abb() {
    int i = 0;
    int j = 0;
    int t = 0;
    int k = 0;
    int l1 = 32;
    int l2 = 20;
    int l3 = 8;

    for (int i = 0; i < 64; i++) {
        bp[i] = fgetc(fp);
    }

    for (i = m; i < l1 + m; i++) {
        book2.fio[k] = bp[i];
        k++;
    }
    k = 0;
    for (j = i; j < l2 + i; j++) {
        book2.street[k] = bp[j];
        k++;
    }
    k = 0;
    book2.home = bp[j];
    j++;
    j++;
    book2.flat = bp[j];
    for (t = j + 2; t <= j + 2 + l3; t++) {
        book2.date[k] = bp[t];
        k++;
    }
    k = 0;
    m = t;
}

int main() {
    fp = fopen("BASE4.DAT", "r");

    if (fp == NULL) {
        printf("Error File!\n");
        system("pause");
        exit(1);
    }

    //memset(&book, 0, sizeof(book));

    rewind(fp);

    fread(book.fio, sizeof(book.fio), 32, fp);
    fread(book.street, sizeof(book.street), 20, fp);
    fread(&book.home, sizeof(book.home), 1, fp);
    fread(&book.flat, sizeof(book.flat), 1, fp);
    fread(book.date, sizeof(book.date), 8, fp);

    rewind(fp);

    abb(); // Топорный метод

    printf("Method one: \n\n%s\n%s\n%u %u\n%s\n+--------+\n", book.fio, book.street, &book.home, &book.flat, book.date);

    printf("\nMethod two: \n\n%s\n%s\n%u %u\n%s\n", book2.fio, book2.street, book2.home, book2.flat, book2.date);

    for (int y = 0; y < 31; y++)
        printf("%c", book.fio[y]);

    system("pause");
}

Ответы (1 шт):

Автор решения: Harry

Ну, у вас структура явно не соответствует файлу. Как минимум там — в файле — двухбайтные целые... Поскольку в файле нет завершающих нулевых, а заполнение пробелами — я их (нулевые) записывал сам.

Можно и без этого, тогда надо выводить посимвольно, как date, и fio, и street. Тут уж как знаете; если есть длинные данные — fio или street на всю длину — то лучше выводить посимвольно.

Вот работающий вариант:

#include <stdio.h>
#include <stdlib.h>

struct adres_book
{
    char fio[32];
    char street[20];
    unsigned short int home;
    unsigned short int flat;
    char date[8];
} book;

int main()
{
    FILE * fp = fopen("BASE4.DAT", "rb");

    if (fp == NULL) {
        printf("Error File!\n");
        system("pause");
        exit(1);
    }

    while(fread(&book,sizeof(book),1,fp) == 1)
    {
        book.fio[sizeof(book.fio)-1] = 0;
        book.street[sizeof(book.street)-1] = 0;
        printf("%31s %19s %3hu %3hu ", book.fio, book.street, book.home, book.flat);
        for(int i = 0; i < 8; ++i) printf("%c",book.date[i]);
        puts("");
    }

    fclose(fp);
}

Пересмотрел, есть длинные строки — так что правильнее цикл в таком виде:

while(fread(&book,sizeof(book),1,fp) == 1)
{
    for(int i = 0; i < 32; ++i) printf("%c",book.fio[i]);
    printf(" ");
    for(int i = 0; i < 20; ++i) printf("%c",book.street[i]);
    printf(" %3hu %3hu ", book.home, book.flat);
    for(int i = 0; i < 8; ++i) printf("%c",book.date[i]);
    puts("");
}
→ Ссылка