@Karmaev

Почему при работе с бинарными файлами .exe вызвал срабатывание точки останова СИ?

Я вызываю две эти функции: сначала добавляю данные в файл, затем считываю в массив структур и вывожу. Первая функция работает, а при вызове второй функции - "срабатывание точки останова" при присвоении переменной fp указателя на поток - при вызове функции fopen(). Помогите разобраться с проблемой не понимаю, где ошибка. Может быть это из-за глобальных переменных? Функция number_input просто присваивает значение по указателю.
#include <stdio.h>

FILE* fp;
struct member* arr;
int arr_len = 0;

void add_data() {
    fp = fopen("database.bin", "wb");
    arr_len++;
    arr = realloc(arr, sizeof(struct member*) * arr_len);
    printf("  Input information about new member:");
    do {
        printf("\nFull name - ");
        getchar();
        gets(arr[arr_len - 1].full_name);
    } while (!contain_latin_letters(arr[arr_len - 1].full_name, strlen(arr[arr_len - 1].full_name)));
    do {
        printf("Club - ");
        gets(arr[arr_len - 1].club);
    } while (!contain_latin_letters(arr[arr_len - 1].club, strlen(arr[arr_len - 1].club)));
    do {
        printf("Role (goalkeeper, defender, midfielder, striker) - ");
        gets(arr[arr_len - 1].role);
    } while (!(!strcmp(arr[arr_len - 1].role, "goalkeeper") || !strcmp(arr[arr_len - 1].role, "defender") || !strcmp(arr[arr_len - 1].role, "midfielder") || !strcmp(arr[arr_len - 1].role, "striker")));
    number_input("Age of member - ", &arr[arr_len - 1].age);
    number_input("Number of matches played for team - ", &arr[arr_len - 1].matches);
    number_input("Number of scored goals - ", &arr[arr_len - 1].goals_scored);

    char* c = (char*)arr; // устанавливаем указатель на начало структуры
    // посимвольно записываем в файл структуру
    for (int i = 0; i < sizeof(struct member) * arr_len; i++)
    {
        putc(*c++, fp);
    }
    fclose(fp);
}

void output_database() {
    fp = fopen("database.bin", "rb");

    char* c = (char*)arr;
    // считываем посимвольно из файла
    int i;
    while ((i = getc(fp)) != EOF)
    {
        *c = i;
        c++;
    }
    for (i = 0; i < arr_len; i++)
        printf("%s   %s   %s   %d   %d   %d\n", arr[i].full_name, arr[i].club, arr[i].role, arr[i].age, arr[i].matches, arr[i].goals_scored);
    fclose(fp);
}
  • Вопрос задан
  • 326 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Первая функция работает, а при вызове второй функции - "срабатывание точки останова" при присвоении переменной fp указателя на поток - при вызове функции fopen(). Помогите разобраться с проблемой не понимаю, где ошибка.

Вторая функция как-то очень сильно завязана на первую: arr она не инициализирует и считает, что там достаточно места для содержимого файла. Но это всё происходит после заявленной проблемы.
В первой функции вызовы gets читают строчки неограниченной длины в какие-то поля твоей структуры. Определения структуры ты не привёл, но мой магический шар говорит, что gets вполне может вылезти за пределы полей в которые он читает и поломать кучу. Можно попробовать заменить gets(x) на fgets(x, sizeof(x), stdin).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы