Не получается считать данные с файла.0xC0000005: нарушение прав доступа при записи по адресу 0x0014D000
#include <iostream>
using namespace std;
struct food
{
char name[10];
int kol;
float price;
};
struct food shop[10];
void main()
{
//setlocale(LC_ALL, "Russian");
FILE* file;
fopen_s(&file,"data.txt", "r");
int i = 0;
while (fscanf_s(file, "%s %d %f", &(shop[i].name), &(shop[i].kol),&(shop[i].price)) != EOF)
{
cout << shop[i].name << " " << shop[i].kol << " " << shop[i].price << " "<<shop[i].kol*shop[i].price<<endl;
i++;
}
fclose(file);
system("pause");
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Вообще-то когда в fscanf_s - с _s - передается строка, надо указывать ее размер. Вы этого не делаете, происходит смещение аргументов.
Кстати, VC++ честно ругается на ваш код:
test.cpp(18): warning C4477: "fscanf_s": в строке форматирования "%s" требуется аргумент типа "unsigned int", но вариативный аргумент "2" имеет тип "int *"
test.cpp(18): note: этот аргумент используется в качестве размера буфера
test.cpp(18): warning C4477: "fscanf_s": в строке форматирования "%d" требуется аргумент типа "int *", но вариативный аргумент "3" имеет тип "float *"
test.cpp(18): warning C4473: "fscanf_s": передано недостаточно аргументов для строки формата
Разберитесь, какие аргументы следует передавать в fscanf_s.
Попробуйте примерно так:
FILE* file;
if (0 != fopen_s(&file,"data.txt", "r"))
{
printf("Error open file\n");
return 1;
}
int i = 0;
while (fscanf_s(file, "%s %d %f", &(shop[i].name), 10,
&(shop[i].kol), &(shop[i].price)) != EOF)
{
Да, и int main(), а не void main()...