Есть структура с информацией про игрушки, название, цена, возраст. Сначала создаем файл, а потом с него читаем. Не могу вывести названия и цены самой дешевой и дорогой игрушки. Не пойму в чем проблема. Если можно то без всяких сложностей (типа :: ).
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <Windows.h>
using namespace std;
struct toys {
char name[12];
float price;
int min_age;
int max_age;
} toy;
void toyin() {
int i;
FILE *f;
i=1;
if ((f=fopen("toys.dat", "wb"))==NULL) {
printf("Error!!!\n");
}
do {
printf("Toy #%i \n",i++);
printf("Name: ");
scanf("%s", &toy.name);
printf("Price: ");
scanf("%f", &toy.price);
printf("Min age: ");
scanf("%i", &toy.min_age);
printf("Max age: ");
scanf("%i", &toy.max_age);
fwrite(&toy, sizeof(toy),1,f);
printf("Finish? (Esc) \n");
}
while (getch()!=27);
fclose(f);
}
void toyout() {
FILE *f;
if ((f=fopen("toys.dat", "rb"))==NULL) {
printf("Error!!!\n");
}
printf("Searched toys: ");
while ( fread(&toy,sizeof(toy),1,f)!=0) {
if (toy.min_age>=3 && toy.max_age<=5 && toy.price<=200) {
printf("%s ", toy.name);
}
}
fclose(f);
printf("\n");
}
void toyprice() {
int min, max;
string min_name;
string max_name;
max = 0;
FILE *f;
if ((f=fopen("toys.dat", "rb"))==NULL) {
printf("Error!!!\n");
}
while (fread(&toy,sizeof(toy),1,f)!=0) {
if (toy.price>max) {
max = toy.price;
max_name = toy.name;
}
}
min = max;
while (fread(&toy,sizeof(toy),1,f)!=0) {
if (toy.price<min) {
min = toy.price;
min_name = toy.name;
}
}
//ТУТ ВЫДАЕТ ОШИБКУ
printf("Min price: %s %f Max price: %s %f \n", min_name, min, max_name, max);
fclose(f);
}
int main() {
char flag;
cout<<"Write file? (Y/N): ";
cin>>flag;
if (flag=='y' || flag=='Y') {
toyin();
}
else {
cout<<"Read file? (Y/N): ";
cin>>flag;
if (flag=='y' || flag=='Y') {
toyout();
toyprice();
}
}
system("pause");
return 0;
}
int min, max;
string min_name;
string max_name;
...
printf("Min price: %s %f Max price: %s %f \n", min_name, min, max_name, max);
Формат %s
требует C-строку в качестве аргумента, а вы ему туда std::string
передаете. Разумеется, получится белиберда.
Формат %f
требует значение типа double
в качестве аргумента, а вы ему туда int
передаете. Разумеется, получится белиберда.
scanf("%s", &toy.name);
Использование оператора &
в совокупности с форматом %s
- практически всегда ошибка.
while (fread(&toy,sizeof(toy),1,f)!=0) {
...
}
...
while (fread(&toy,sizeof(toy),1,f)!=0) {
...
}
После того, как первый цикл завершился из-за того, что fread
не смогла больше ничего прочитать, почему вы надеетесь, что в втором цикле fread
вдруг сможет что-то прочитать?
Почему toy
объявлена как глобальная переменная? Судя по остальному коду, вы умеете объявлять локальные переменные. В чем тогда идея с глобальной toy
?
Формат %i
в функции scanf
предназначен в первую очередь для того, чтобы дать пользователю возможность подавать на вход не только десятичную запись целочисленных значений, но и восьмеричную, и шестнадцатеричную запись: через использование принятых в С и С++ префиксов 0
или 0x
. Вы в своей программе хотели дать пользователю такую возможность? Если нет, то к чему здесь %i
?
Для использования типа std::string
необходимо включение заголовка <string>
. Где оно у вас в коде?
Что за мешанина из ввода/вывода средствами C и ввода/вывода средствами С++?
Что в этой программе делает #include <string.h>
и #include <Windows.h>
?
Виртуальный выделенный сервер (VDS) становится отличным выбором
Какой алгоритм будет самым оптимальным ? На вход массив из 4 float , а на выходе отсортированный
Нужно объявить и инициализировать unique_ptrОн должен указывать на структуру
Разбираюсь в libiio, пытаюсь написать условный Hello world модуль (упростил до одной строчки)