Ошибка 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считывает строку целиком и не требует явного указания количества считываемых значений. - Этот подход может быть менее эффективным, если в файле содержатся только числовые значения, но он может помочь избежать ошибок чтения данных.
- В любом случае, для решения проблемы необходимо более подробно изучить код программы и данные в файле, чтобы определить причину ошибки.