Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: структуры  (Прочитано 14335 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
юра
Интересующийся

ru
Offline Offline

« : 09-12-2010 20:46 » 

Надо создать структуру,ввести в неё данные с клавиатуры,упорядочить по цене,записать в файл и прочитать.
Вот что то написал,но надо упорядочить прямо в файле и как записать в начало файла количество записей,а потом прочитать вместе со структурой.Не получается А черт его знает...
Ниже текст программы.


Добавлено через 27 секунд:
Код: (C++)
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

//opredelyaem strukturu
struct
{  
    char model[25];
    int price;
    double x_size;
    double y_size;
    int optr;
    int grey;
} scan[3], buf[3], sort;//opisateli

int main()
{
    int i,g,j;
    int kolzap=3;
    FILE *fscan=fopen("d:\\informatika\\work_8\\binfile.out","w+b");
    ////////vvod dannih/////////////////////
    for(i=0;i<kolzap;i++)
    {
        cout<<"vvedite model:"<<endl;
        cin>>buf[i].model;
        cout<<"price:"<<endl;
        cin>>buf[i].price;
        cout<<"x size:"<<endl;
        cin>>buf[i].x_size;
        cout<<"y size:"<<endl;
        cin>>buf[i].y_size;
        cout<<"optr:"<<endl;
        cin>>buf[i].optr;
        cout<<"grey:"<<endl;
        cin>>buf[i].grey;
        clrscr();}
    /////////////sortiruem po price///////////////////////////////////
    for(g=0;g<kolzap-1;g++)
    {
        for(j=g+1;j<kolzap;j++)
        {
            if(buf[j].price>buf[g].price)
            {
                sort=buf[j];
                buf[j]=buf[g];
                buf[g]=sort;
            };
        }
    }
    //////////////zapisivaem v fayl i zakrivaem////////
    for(i=0;i<kolzap;i++)
    {
        fwrite(&buf,sizeof(buf),1,fscan);
    }
    fclose(fscan);
    /////////chitaem fayl v druguyu struct/////////
    fscan=fopen("d:\\informatika\\work_8\\binfile.out","r+b");
    clrscr();
    for(i=0;i<kolzap;i++)
    {
        fread(&scan,sizeof(buf),1,fscan);
        cout<<"\nmodel:"<<scan[i].model<<" price="<<scan[i].price<<" x size="<<scan[i].x_size<<" y size="<<scan[i].y_size<<" optr="<<scan[i].optr<<" grey="<<scan[i].grey;
    }
    fclose(fscan);

    return (0);
}
« Последнее редактирование: 09-12-2010 21:42 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 09-12-2010 21:40 » 

В чем же заключается вопрос?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 10-12-2010 05:52 » 

http://www.realcoding.net/article/view/6469
почему, третий параметр fread/fwrite равен 1?
ну и C Style это не круто, если ты пишешь на C++

немного поправил код, что бы был похож на C++, за одно убрал пару ошибок
Код: (C++)
#include <iostream>
#include <fstream>

using namespace std;
//opredelyaem strukturu
struct TModel
{
    char model[25];
    int price;
    double x_size;
    double y_size;
    int optr;
    int grey;
    bool operator<(const TModel & rhs) const
    {
        return price < rhs.price;
    }

    void FillStructFromConsole()
    {
        cout<<"vvedite model:"<<endl;
        cin>>model;
        cout<<"price:"<<endl;
        cin>>price;
        cout<<"x size:"<<endl;
        cin>>x_size;
        cout<<"y size:"<<endl;
        cin>>y_size;
        cout<<"optr:"<<endl;
        cin>>optr;
        cout<<"grey:"<<endl;
        cin>>grey;
    }

    void DumpToConsole()
    {
        cout<<"model:"<<model
            <<" price="<<price
            <<" x size="<<x_size
            <<" y size="<<y_size
            <<" optr="<<optr
            <<" grey="<<grey
            <<"\n";
    }

    void WriteBinary(ofstream & f)
    {
        f.write((char*)this, sizeof(*this));
    }

    void ReadBinary(ifstream & f)
    {
        f.read((char*)this, sizeof(*this));
    }
};
const char fillename[] = "binfile.out";
#define ARRAY_SIZE(X) (sizeof(X)/sizeof(X[0]))
int main()
{
    TModel data[3] = {0};

    ////////vvod dannih/////////////////////
    for(int i=0; i != ARRAY_SIZE(data); ++i)
        data[i].FillStructFromConsole();

    /////////////sortiruem po price///////////////////////////////////
    sort(data, data + ARRAY_SIZE(data));

    //////////////zapisivaem v fayl i zakrivaem////////
    {
        ofstream ofs(fillename, ofstream::binary);
        int datasize = ARRAY_SIZE(data);
        ofs.write((char*)&datasize, sizeof(datasize));
        for(int i=0; i != ARRAY_SIZE(data); ++i)
            data[i].WriteBinary(ofs);
    }

    /////////chitaem fayl v druguyu struct/////////
    TModel * data_from_file = NULL;
    int datasize = 0;
    {
        ifstream ifs(fillename, ifstream::binary);
        ifs.read((char*)&datasize, sizeof(datasize));
        data_from_file = new TModel[datasize];
        for(int i=0; i != datasize; ++i)
            data_from_file[i].ReadBinary(ifs);
    }

    for(int i=0; i != datasize; ++i)
        data_from_file[i].DumpToConsole();
    delete [] data_from_file;

    return 0;
}
Записан

Странно всё это....
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 10-12-2010 06:43 » 

В чем же заключается вопрос?

А это и не вопрос вовсе. Это приказ:

Надо создать структуру,ввести в неё данные с клавиатуры,упорядочить по цене,записать в файл и прочитать.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
юра
Интересующийся

ru
Offline Offline

« Ответ #4 : 10-12-2010 21:15 » 

это не приказ)
Надо создать структуру,ввести в неё данные с клавиатуры,упорядочить по цене,записать в файл и прочитать.
Это я сделал!Вопрос хаключается в том  как "упорядочить записи прямо в файле и как записать в начало файла количество записей,а потом прочитать вместе со структурой."?
помогите пожалуйста)

Добавлено через 3 минуты и 37 секунд:
Антон спасибо за исправления)))fread/fwrite равен 1.Так показано в примере в учебнике Павловской,структура-это одна запись,а sizeof определяет размер структуры)

Добавлено через 2 минуты и 23 секунды:
И у меня вопрос зачем нужен using namespace std;?
« Последнее редактирование: 10-12-2010 21:21 от юра » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 10-12-2010 21:31 » 

юра, Почитай тут
« Последнее редактирование: 10-12-2010 21:33 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 13-12-2010 03:50 » 

Добавлено через 3 минуты и 37 секунд:
Антон спасибо за исправления)))fread/fwrite равен 1.Так показано в примере в учебнике Павловской,структура-это одна запись,а sizeof определяет размер структуры)

Добавлено через 2 минуты и 23 секунды:
И у меня вопрос зачем нужен using namespace std;?
1. насчёт write я тебе нагнал, а вот fread третьим параметром принимает колличество байт которые надо прочитать, в твоём случае это или один размер структуры и сразу 3 если подсовываешь буфер для трёх
http://cplusplus.com/reference/clibrary/cstdio/fwrite/
http://cplusplus.com/reference/clibrary/cstdio/fread/
2. Судя по заголовкам ты пользуешься или старым компилятором или старыми хедерами
согласно стандарту всякие cout и cin перенесены в пространство имён std
и новые хедеры называются например не iostream.h, а iostream (без расширения)
старые хедеры остались для совместимости.
ну и ввиду того, что я пользовался новыми хедерами и соотвественно имею cin/cout/ifstream/ofstream в пространстве имён std, то что бы не писать перед этими именами каждый раз std::
я в начале файла написал using namespace std ,  т.е. сообщил копилятору, что неплохо бы смотреть не только текущее пространство имён, но и пространство std, иначе получаем ошибку "Объявление не найдено" или что-то типа того.
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 13-12-2010 04:34 » 

Антон, судя по заголовкам, программа была написана под BC++3: либо так хреново преподают, либо так хреново копипастят решения.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 13-12-2010 04:47 » new

RXL, скорее второе
1. в куче книг российских авторов или старых переводах всречал такую хрень
2. заметил, что в некоторых институтах любят старый bc++3, непонимаю почему, есть куча халявных альтернатив и просветкой синтаксиса и прочими рюшками и главное нормальным компилятором, в том числе от Microsoft, таже VS Express
Я уж молчу про DevCpp и CodeBlocks
Записан

Странно всё это....
юра
Интересующийся

ru
Offline Offline

« Ответ #9 : 19-12-2010 10:03 » 

Антон,спасибо большое!Выручил)
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 20-12-2010 03:38 » 

заходи еще Улыбаюсь
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines