Ошибка fscanf: Access violation writing location 0xCDCDCDCD - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Уважаемые, пожалуйста помогите разобраться с данной ошибкой. Она возникает при вводе данных из файла в структуру с помощью функции fscanf. Первые строковые данные считываются правильно, а далее идут целочисленные и вот здесь возникает эта ошибка. Ошибка:
Unhandled exception at 0x512EC28C (msvcr120d.dll) in CURS.EXE: 0xC0000005: Access violation writing location 0xCDCDCDCD.
Вот участок кода:
struct str_music *create(struct str_music *head, char* FileName) {
    struct str_music *element; // указатель на новую структуру
    FILE *file;
    file = fopen(FileName, "r");
    int i=0;
    do{
        element = (struct str_music *)malloc(sizeof(struct str_music));
        element->next = head;
        element->id = i;
        i++;
    } while (fscanf(file, "%s%s%s%d%d", element->firm, element->model, element->type, element->theres, element->price) != EOF);
    return element;
}
Скриншот на момент ошибки: Текстовый файл:
Ashtone AB-12/BK bass_guitar 2 9100 Warwick Streamer_Stage_I_5 bass_gutar 1 64389
Вот на всякий случай весь код программы:
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
#include <direct.h>
 
struct str_music{
    int id;
    char firm[20];
    char model[20];
    char type[20];
    int theres;
    int price;
    struct str_music *next;
};
char* names[] = { "ID", "Производитель", "Модель", "Тип инструмента", "Количество", "Цена" };
char FileName[158];
 
void logo(){
    printf("%52s\n", "Каталог музыкальных инструментов");
    printf("\n\n\n");
}
 
void catalog(){
    WIN32_FIND_DATA FindFileData;
    HANDLE hf;
    int result;
 
    //создаем каталог, если не существует
    result = mkdir("catalog");
    if (result == 0)
        printf("Каталог \"lab9\\catalog\" создан\n");
 
    //Вывод содержимого каталога
    printf("Содержимое каталога (lab9\\catalog):\n");
    hf = FindFirstFile(L"catalog\\*", &FindFileData);
    if (hf != INVALID_HANDLE_VALUE){
        do{
            wprintf(L"%s\n", FindFileData.cFileName);
        } while (FindNextFile(hf, &FindFileData) != 0);
        FindClose(hf);
        printf("=====================================\n");
    }
}
 
void open_catalog(char* cat){
    FILE *file;
    char tmp_FileName[150];
    int i = 0;
 
x1: printf("\nВведите имя файла: ");
    gets(tmp_FileName);
    fflush(stdin);
    for (i; strlen(tmp_FileName) - 1 + strlen(cat) - 1; i++){
        if (i < strlen(cat)) FileName[i] = cat[i];
        else FileName[i] = tmp_FileName[i - strlen(cat)];
        if (FileName[i] == '\0') break;
    }
    FileName[i+1] = '\0';
    if ((file = fopen(FileName, "r")) == NULL){
        printf("Файл \"%s\" не удалось открыть! Попробуйте снова..\n", FileName);
        goto x1;
    }
    else printf("Файл \"%s\" успешно открыт!\n\n", FileName);
}
 
void create_catalog(char* cat){
    FILE *file;
    char tmp_FileName[150];
 
x1: printf("\nВведите имя файла: ");
    gets(tmp_FileName);
    for (int i = 0; strlen(tmp_FileName) - 1 + strlen(cat) - 1; i++){
        if (i < strlen(cat)) FileName[i] = cat[i];
        else FileName[i] = tmp_FileName[i - strlen(cat)];
        if (FileName[i] == '\0') break;
    }
    if ((file = fopen(FileName, "r")) != NULL){
        printf("Файл \"%s\" уже существует! Введите другое имя..\n", FileName);
        goto x1;
    }
    else {
        file = fopen(FileName, "w");
        printf("Файл \"%s\" успешно создан!\n\n", FileName);
    }
    printf("=====================================\n\n");
}
 
void delete_catalog(char* cat){
    FILE *file;
    char tmp_FileName[150];
 
x1: printf("\nВведите имя файла: ");
    gets(tmp_FileName);
    for (int i = 0; strlen(tmp_FileName) - 1 + strlen(cat) - 1; i++){
        if (i < strlen(cat)) FileName[i] = cat[i];
        else FileName[i] = tmp_FileName[i - strlen(cat)];
        if (FileName[i] == '\0') break;
    }
 
    if (-1 == remove(FileName)){
        printf("Файла \"%s\" не существует! Повторите попытку..\n", FileName);
        goto x1;
    }
    else printf("Файл \"%s\" успешно удален!\n\n", FileName);
    printf("=====================================\n\n");
}
 
char* OpenFile(){
    char* cat = "catalog\\";
    int cat_active = 0;
 
c1: catalog();
    printf("1. Выбрать базу данных\n");
    printf("2. Создать базу данных\n");
    printf("3. Удалить базу данных\n");
    printf("=====================================\n");
    printf("Введите номер нужного действия: ");
    scanf("%d", &cat_active);
    fflush(stdin);
    printf("\n");
    switch (cat_active)
    {
    case 1:
        open_catalog(cat);
        break;
    case 2:
        create_catalog(cat);
        goto c1;
    case 3:
        delete_catalog(cat);
        goto c1;
    default:
        printf("Действие не найдено! Повторите попытку..\n");
        goto c1;
    }
    return FileName;
}
 
struct str_music *create(struct str_music *head, char* FileName) {
    struct str_music *element; // указатель на новую структуру
    FILE *file;
    file = fopen(FileName, "r");
    int i=0;
    do{
        element = (struct str_music *)malloc(sizeof(struct str_music));
        element->next = head;
        element->id = i;
        i++;
    } while (fscanf(file, "%s%s%s%d%d", element->firm, element->model, element->type, element->theres, element->price) != EOF);
    return element;
}
 
void ViewCatalog(char* FileName, struct str_music *head){
    create(head, FileName);
    FILE *file;
    file = fopen(FileName, "r");
 
    printf("Просмотр каталога\n\n\n");
}
 
void AddInCatalog(char* FileName){
    printf("Добавление данных\n\n\n");
}
 
void ReCatalog(char* FileName){
    printf("Редактирование данных\n\n\n");
}
 
void DelInCatalog(char* FileName){
    printf("Удаление данных\n\n\n");
}
 
void FindInCatalog(char* FileName){
    printf("Поиск данных\n\n\n");
}
void SortCatalog(char* FileName){
    printf("Сортировка данных\n\n\n");
}
 
void main(){
    int i=0;
    int main_active = 0;
    char* FileName;
    struct str_music *head; // адрес, указывающий на голову стека
    head = NULL;
 
    setlocale(LC_ALL, "Russian");
 
    logo();
m1: FileName = OpenFile();
m2: printf("1. Отобразить содержимое каталога\n");
    printf("2. Добавить значения в базу данных\n");
    printf("3. Редактировать данные в каталоге\n");
    printf("4. Удалить данные из каталога\n");
    printf("5. Поиск по каталогу\n");
    printf("6. Сортировка каталога\n");
    printf("7. Выбрать другой каталог\n");
    printf("=====================================\n");
    printf("Введите номер нужного действия: ");
    scanf("%d", &main_active);
    fflush(stdin);
    printf("\n");
    switch (main_active)
    {
    case 1:
        ViewCatalog(FileName, head);
        break;
    case 2:
        AddInCatalog(FileName);
        break;
    case 3:
        ReCatalog(FileName);
        break;
    case 4:
        DelInCatalog(FileName);
        break;
    case 5:
        FindInCatalog(FileName);
        break;
    case 6:
        SortCatalog(FileName);
        break;
    case 7:
        goto m1;
    default:
        printf("Действие не найдено! Повторите попытку..\n\n\n");
        break;
    }
    goto m2;
    //head = sm(head);
}

Решение задачи: «Ошибка fscanf: Access violation writing location 0xCDCDCDCD»

textual
Листинг программы
while (fscanf(file, "%s%s%s%d%d", element->firm, element->model, element->type, &(element->theres), &(element->price)) == 5);

Объяснение кода листинга программы

  1. element - это указатель на структуру данных, которая содержит информацию о продукте.
  2. file - это файл, который содержит данные о продуктах.
  3. element->firm - это строка, которая содержит название фирмы производителя продукта.
  4. element->model - это строка, которая содержит название модели продукта.
  5. element->type - это строка, которая содержит тип продукта.
  6. &(element->theres) - это адрес переменной theres, которая является членом структуры element.
  7. &(element->price) - это адрес переменной price, которая является членом структуры element.
  8. fscanf(file,%s%s%s%d%d) - это функция для чтения данных из файла, которая пытается прочитать пять значений: строку, строку, строку, целое число и целое число.
  9. element->firm, element->model, element->type, element->theres, element->price - это переменные, которые содержат значения, прочитанные из файла.
  10. while (fscanf(file,%s%s%s%d%d) == 5) - это цикл while, который продолжает читать данные из файла до тех пор, пока функция fscanf не вернет значение 5.
  11. Ошибка Access violation writing location 0xCDCDCDCD указывает на то, что программа пытается записать данные по адресу, который не является допустимым для записи.
  12. Это может произойти, если данные в файле некорректны или если программа пытается записать данные за пределами выделенной памяти.
  13. Для решения этой проблемы можно проверить корректность данных в файле или изменить код программы, чтобы он обрабатывал ошибки чтения данных из файла.
  14. Другой возможный подход - это использование функции fgets вместо fscanf, поскольку fgets считывает строку целиком и не требует явного указания количества считываемых значений.
  15. Этот подход может быть менее эффективным, если в файле содержатся только числовые значения, но он может помочь избежать ошибок чтения данных.
  16. В любом случае, для решения проблемы необходимо более подробно изучить код программы и данные в файле, чтобы определить причину ошибки.

Оцени полезность:

14   голосов , оценка 3.714 из 5