Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2016, 19:39   #1
nstwf
Новичок
Джуниор
 
Регистрация: 31.05.2016
Сообщений: 1
По умолчанию Не получается записывать в файл/вводить структуру

Здравствуйте, прощу помощи в решении некоторых ошибок:
Сам код:
Код:
#include <iostream>
#include <windows.h>
#include <fstream>
 
using namespace std;
 
struct product
{
    char name[30];      //имя
    int cost;       //цена
    int srkhr;      //срок хранения
    int datavip;    //дата выпуска
    int srgodn;     //срок годности
};
 
 
void SortStr(product* products, int n)
{
    int i, j;
    product Help;
    for (i = 0; i <= n; i++)
        for (j = n - 1; j > i; j--)
            if (strcmp(products[j].name,
                products[j - 1].name)<0)
            {
                Help = products[j];
                products[j] = products[j - 1];
                products[j - 1] = Help;
            }
}
 
product* AddStruct(product* Obj, const int n)
{
    if (n == 0)
    {
        Obj = new product[n + 1]; // выделение памяти для первой структуры
    }
    else
    {
        product* tempObj = new product[n + 1];
 
        for (int i = 0; i < n; i++)
        {
            tempObj[i] = Obj[i]; // копируем во временный объект
        }
        delete[] Obj;
        Obj = tempObj;
    }
    return Obj;
}
void SetData(product* Obj, const int n)
{
    
    cout << "Название: ";
    scanf_s("%s", &Obj[n].name, 30);
    cout << "Цена: ";
    cin >> Obj[n].cost;
    cout << "Срок хранения: ";
    cin >> Obj[n].srkhr;
    cout << "Дата выпуска: ";
    cin >> Obj[n].datavip;
    cout << "Срок годности: ";
    cin >> Obj[n].srgodn;
    cin.get();
    cout << endl;
 
}
 
 
void showData(const product* Obj, const int n)
{
    system("cls");
    cout << "№  " << "Название\t" << "Цена\t" << "Срок хранения\t" << "Дата выпуска\t" << "Срок годности\t" << endl;
    cout << "=============================================================================================" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << i + 1 << " " << Obj[i].name << '\t' << Obj[i].cost << '\t' << Obj[i].srkhr << '\t' << Obj[i].datavip << '\t' << Obj[i].srgodn << endl;
    }
    cout << "=============================================================================================" << endl;
}
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    product* allproducts = 0;
    int allprod = 0,
        x = 0;
    byte y;
mar:
    cout << "\tМЕНЮ." << endl
        << "1. Добавить данные." << endl
        << "2. Просмотреть результат." << endl
        << "3. Сортировка в алфавитном порядке названий товара." << endl;
    cin >> y;
    switch (y)
    {
    case'1':
        system("cls");
        do
        {
            const char *FName = "ex.txt"; //Путь к файлу. Вписывайте свой.
            product X;
            allproducts = AddStruct(allproducts, allprod);
            SetData(allproducts, allprod);
 
            ofstream f(FName, ios::binary | ios::out);
            f.write((char*)&X, sizeof X); //Записали всю структуру целиком
            f.close();
 
            cout << "Продолжить ввод данных(1-да|0-нет)? ";
            cin >> x;
        } while (x != 0);
        break;
    case'2':
        system("cls");
        showData(allproducts, allprod);
        break;
    case'3':
        system("cls");
        SortStr(allproducts, allprod);
        break;
    default:
        exit(0);
        break;
    }
    cout << "Вернуться в меню? (1-да|0-нет) " << endl;
    int e; cin >> e;
    if (e != 0)
    {
        system("cls");
        goto mar;
    }
    delete[] allproducts;
    system("pause");
}
А ошибки:
- Не заполняет саму структуру, хотя есть функция
- Не выводит структуру, думаю из-за того, что это все-таки последствия первой ошибки.
- Записывает в файл не структуру, а просто строку "МММММММММММММММММ ... МММММММ"
- Как потом считать данную структуру из файла, в которую записывал?

За помощь благодарен!
nstwf вне форума Ответить с цитированием
Старый 01.06.2016, 09:34   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

1) Не записывает потому что всегда n=0 (int allprod = 0)
Измени


void SetData(product* Obj, int &n) // &n - ссылка
{
............................
...........................
n++; // А вот само и увеличение
}

2) Вместо
// SetConsoleCP(1251);
// SetConsoleOutputCP(1251);
Замени на
setlocale(LC_ALL, "Russian");



3) Код и демонстрацию записи/чтения смотри на рисунке. Пока работает только для 1-го экземпляра структуры - доделай.



Последний раз редактировалось ura_111; 01.06.2016 в 09:37.
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить mysql на файл (вместо записи в БД записывать в текстовый файл) прак PHP 2 16.12.2015 23:21
Не получается передать структуру в функцию по ссылке. Pug_from_Mordor Помощь студентам 2 27.04.2015 18:43
Вводить числа с клавиатуры и записывать их в массив JesusChristS Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 29.06.2011 13:31
не получается добавить в структуру Crudelis Общие вопросы C/C++ 4 24.04.2010 16:48
Как записывать в файл Rain Общие вопросы Delphi 5 15.09.2007 18:56