Вывод из файла структуры С++

111
03 декабря 2020, 22:50

Есть структура с информацией про игрушки, название, цена, возраст. Сначала создаем файл, а потом с него читаем. Не могу вывести названия и цены самой дешевой и дорогой игрушки. Не пойму в чем проблема. Если можно то без всяких сложностей (типа :: ).

#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;
}
Answer 1
  • 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>?

READ ALSO
Как быстрее всего отсортировать 4 float-a

Как быстрее всего отсортировать 4 float-a

Какой алгоритм будет самым оптимальным ? На вход массив из 4 float , а на выходе отсортированный

91
Инициализация unique_ptr

Инициализация unique_ptr

Нужно объявить и инициализировать unique_ptrОн должен указывать на структуру

104
Не собирается iio модуль

Не собирается iio модуль

Разбираюсь в libiio, пытаюсь написать условный Hello world модуль (упростил до одной строчки)

113
Умные указатели и утечка памяти

Умные указатели и утечка памяти

Изучаю умные указатели и абстрактные базовые классы

115