Ошибка 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);
Объяснение кода листинга программы
element
- это указатель на структуру данных, которая содержит информацию о продукте.file
- это файл, который содержит данные о продуктах.element->firm
- это строка, которая содержит название фирмы производителя продукта.element->model
- это строка, которая содержит название модели продукта.element->type
- это строка, которая содержит тип продукта.&(element->theres)
- это адрес переменнойtheres
, которая является членом структурыelement
.&(element->price)
- это адрес переменнойprice
, которая является членом структурыelement
.fscanf(file,
%s%s%s%d%d)
- это функция для чтения данных из файла, которая пытается прочитать пять значений: строку, строку, строку, целое число и целое число.element->firm
,element->model
,element->type
,element->theres
,element->price
- это переменные, которые содержат значения, прочитанные из файла.while (fscanf(file,
%s%s%s%d%d) == 5)
- это цикл while, который продолжает читать данные из файла до тех пор, пока функцияfscanf
не вернет значение 5.- Ошибка
Access violation writing location 0xCDCDCDCD
указывает на то, что программа пытается записать данные по адресу, который не является допустимым для записи. - Это может произойти, если данные в файле некорректны или если программа пытается записать данные за пределами выделенной памяти.
- Для решения этой проблемы можно проверить корректность данных в файле или изменить код программы, чтобы он обрабатывал ошибки чтения данных из файла.
- Другой возможный подход - это использование функции
fgets
вместоfscanf
, посколькуfgets
считывает строку целиком и не требует явного указания количества считываемых значений. - Этот подход может быть менее эффективным, если в файле содержатся только числовые значения, но он может помочь избежать ошибок чтения данных.
- В любом случае, для решения проблемы необходимо более подробно изучить код программы и данные в файле, чтобы определить причину ошибки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д