Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
#1

Stl отсортировать структуру - C++

03.03.2014, 10:12. Просмотров 948. Ответов 27
Метки нет (Все метки)

вообщем есть задача:
Написать функцию, которая читает данные о ноутбуках из файла note.txt в структуру приведенного вида. Написать функцию, которая записывает содержимое структуры в конец бинарного файла. Структура бинарного файла: первые два байта - целое число записей в файле, далее записи в формате структуры NOTEBOOK.
Написать программу, в которой на основе разработанных функций осуществляется запись в двоичный файл данных о ноутбуках, отсортированных в порядке уменьшения тактовой частоты процессора.
я закрыл глаза на то, что в задачи про видеопамять нигде не упоминается, это опускаем.

вообщем как сделать сортировку по частоте при помощи STL? Не хочу делать топорно, всётаки STL пытаюсь освоить, и что касается записи в бинарный файл, тоже как это сделать через write? ну или другие варианты

за обилие комментариев прошу прощение - делаю для человека, который 0 в программировании

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
 
struct NOTEBOOK{
    struct disp_res{
    int x;              // разрешение экрана
    int y;              //
    };
disp_res disp;
int f;          // частота
float d;        // диагональ
int price;      // цена
char model[21]; // название
};
 
// функция которой мы считываем файл в массив структур NOTE
void readNote(vector<NOTEBOOK> &a, ifstream& in)
{
string str;                 // буфер для хранения считываемой информации
NOTEBOOK n;                 // структура, в которую мы считываем данные из потока in
 
    while (!in.eof())
    {
    in>>str;                        // считываем до первого пробела в str
    n.disp.x=atoi(str.c_str());     // преобразуем тип string в тип int с помощью функции atoi и записываем в n.disp.x
 
    in>>str;
    n.disp.y=atoi(str.c_str());     // аналогично
 
    in>>str;
    n.f=atoi(str.c_str());          // всё тоже самое
 
    in>>str;
    n.d=float(atof(str.c_str()));   // преобразуем функцией atof стринг в double, а затем в float и записываем в
 
    in>>str;
    n.price=atoi(str.c_str());      // аналогично с 1ыми
 
    in>>str;
    strcpy(n.model,str.c_str());    // здесь мы тип string приводим к типу char* методом c_str()(т.к. функции strpy принимает только char* - указатель на char) а затем вызываем функцию strcpy
                                    // которая копирует str в массив символов model[21]
 
    a.push_back(n);              // добавляем в наш контейнер структуру n - метод push_back добавляет структуру в конецочереди, т.е. это аналогиятого
                                 // как мы кладём вещи в коробку - первая вещь будет снизу, т.е. 0, вторая будет над ней, т.е. 1 и т.д.
    }
}
 
// функция для простмотра вектора с структурами
void show(vector<NOTEBOOK> &a)
{
vector<NOTEBOOK>::iterator iter_a;      // создаем итератор для прохода по вектору со структурами, итератор - это своеобразный указатель, используемый для STL контекнеров, советую почитать, там всё просто
int i=0;        // просто счетчик для отображения номера структуры
    for(iter_a=a.begin();iter_a!=a.end();iter_a++)  // цикл - начинается с указателя a.begin() - начала ветора, и продолжается до a.end()... вообщем почти тоже самое что и обычный цикл
    {
    cout<<"Разрешение экрана : "<<a[i].disp.x<<" x "<<a[i].disp.y<<endl<<"Частота ГГц : "<<a[i].f<<endl<<"Диагональ экрана : "<<a[i].d<<endl<<"Цена : "<<a[i].price<<endl<<"Модель : "<<a[i].model<<endl<<endl;
    i++;    // итерируем счетчик
    }
}
 
int main()
{
setlocale(LC_ALL, "Russian");
ifstream in("note.txt");
vector <NOTEBOOK> a;
 
readNote(a,in);     // считываем в а данные из note.txt
show(a);            // выводим записанные данные
 
return 0;
}
0
Вложения
Тип файла: rar AleksandraVasil_2_free.rar (259.5 Кб, 3 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2014, 10:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Stl отсортировать структуру (C++):

как отсортировать файл с STL - C++
имеются два файла, в одном файле в первой строке: &quot;SANTA CLAUS&quot; Во второй &quot;DED MOROZ&quot; В третьей набор букв: &quot;SANTAMOROZDEDCLAUS&quot;. ...

Создать stl очередь, заполнить ее случайным образом и отсортировать - C++
вопрос в заголовке, заранее спасибо.

STL Заполнить массив размером 10 случайными числами от 0 до 10, отсортировать его по убыванию и вывести - C++
Заполнить массив размером 10 случайными числами от 0 до 10, отсортировать его по убыванию и вывести в выходной поток. Добавлено через...

Отсортировать структуру - C++
Задание такое Описать структуру с именем Train содержащую следующие поле. nazn-название пункта назначения numr -номер поезда ...

Отсортировать структуру - C++
Начал изучать структуры. Разобрался как вводить и выводить, но при попытке вывести через отдельную функцию не выводится первой символ....

отсортировать структуру - C++
Всем привет, вот такой вопрос, не получается правильно отсортировать следующую структуру по z координате vector&lt;Quaternion&gt;q; ...

27
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.03.2014, 10:52 #2
эм а определить операцию сравнения 2х записей по полю тактовой частоты и ее в qsort например
1
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
03.03.2014, 10:53  [ТС] #3
Цитата Сообщение от aLarman Посмотреть сообщение
эм а определить операцию сравнения 2х записей по полю тактовой частоты и ее в qsort например
вот это я и хочу сделать, но не особо нашёл как это будет выглядеть
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.03.2014, 10:57 #4
C++
1
2
3
4
bool Compare(NOTEBOOK first, NOTEBOOK second)
{
return first.freq < second.freq;
}
freq поле с частотой
1
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
03.03.2014, 10:58  [ТС] #5
всё вроде нашёл, копал не в ту сторону
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.03.2014, 11:00 #6
или
C++
1
2
3
4
struct Compare
{
bool operator()(NOTEBOOK first, NOTEBOOK second) { return first.freq  < second.freq;}
}
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
03.03.2014, 11:02 #7
Цитата Сообщение от dzrkot Посмотреть сообщение
и что касается записи в бинарный файл, тоже как это сделать через write?
Вы же используете файловый поток. Тогда в чем вопрос?
Цитата Сообщение от dzrkot Посмотреть сообщение
вообщем как сделать сортировку по частоте при помощи STL?
Стандартный алгоритм sort со своим бинарным предикатом.
C++
1
2
3
4
5
6
7
  template <class _Tp>
    struct compare : public binary_function<_Tp, _Tp, _Tp>
    {
      bool
      operator()(const _Tp& x, const _Tp& y) const
      { return x.f < y.f; }
    };
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.03.2014, 11:08 #8
Цитата Сообщение от Ilot Посмотреть сообщение
template <class _Tp>
Что ж вас так тянет-то использовать имена, начинающиеся с подчеркивания?! Да еще и с последующей заглавной буквой.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
03.03.2014, 11:12  [ТС] #9
Цитата Сообщение от Ilot Посмотреть сообщение
Стандартный алгоритм sort со своим бинарным предикатом.
Код C++
C++
1
2
3
4
5
6
7
template <class _Tp>
 struct compare : public binary_function<_Tp, _Tp, _Tp>
 {
 bool
 operator()(const _Tp& x, const _Tp& y) const
 { return x.f < y.f; }
 };
эм..вы со мной разговаривали?) я ещё не настолько крут в С++ чтобы понять)

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
public binary_function<_Tp, _Tp, _Tp>
вот этого не понял просто)
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
03.03.2014, 11:14 #10

Не по теме:

Tulosba, просто я ленивый. Для ответа на вопрос мне проще открыть реализацию своего компилятора и малось подправить имеющийся там код.


Цитата Сообщение от dzrkot Посмотреть сообщение
эм..вы со мной разговаривали?) я ещё не настолько крут в С++ чтобы понять)
Спасибо потешили старичка. Уж я то точно не крут в с++... пока...
Из моего компилятора:
C++
1
2
3
4
5
6
7
8
9
  template <class _Arg1, class _Arg2, class _Result>
    struct binary_function
    {
      typedef _Arg1 first_argument_type;   ///< the type of the first argument
                                           ///  (no surprises here)
 
      typedef _Arg2 second_argument_type;  ///< the type of the second argument
      typedef _Result result_type;         ///< type of the return type
    };
1
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
03.03.2014, 11:29  [ТС] #11
Цитата Сообщение от Ilot Посмотреть сообщение
Вы же используете файловый поток. Тогда в чем вопрос?
вопрос в том, что я этого ни разу не делал и ищу примеры...а вообще я не особо представляю что будет на выходе, я так понял что там будет всякая бинарная абракадабра)

Добавлено через 6 минут
или обычный .тхт....? что от меня хотят в задании?))
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
03.03.2014, 11:38 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
От вас хотят именно бинарный файл. Сперва вы записываете число типа short - количество записей:
C++
1
2
unsigned short count;
out.write(reinterpret_cast<char*>&count, sizeof(short));
Далее в цикле заносите структуры в файл:
C++
1
2
for (int i = 0; i < count; ++i)
out.write(reinterpret_cast<char*>&a[i], sizeof(NOTEBOOK));
Открываете файл как бинарный:
C++
1
ofstream out("имя файла", ios::bin);
1
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
03.03.2014, 11:48  [ТС] #13
Цитата Сообщение от Ilot Посмотреть сообщение
ofstream out("имя файла", ios::bin);
ругается на bin , с binary всё ок)

сделал функцию так, в самом бинарнике получаю
4 ђ   pAА] Pentium ию" я" 0 @ ˜ь" @ И  €A N Asus ию" я" 0 @ ˜ь"
*  ˜A { Intel ию" я" 0 @ ˜ь"  8  €AHq Lenovo ию" я" 0 @ ˜ь"

я так поимаю что это норм?))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void writeFile(vector<NOTEBOOK> a, ofstream &out)
{
out<<a.size();
vector<NOTEBOOK>::iterator iter_a;    
int i=0;                               
unsigned short counter =(a.size());
out.write(reinterpret_cast<char*> (&counter), sizeof(a.size()));
    for(iter_a=a.begin();iter_a!=a.end();iter_a++)      
    {
    out.write(reinterpret_cast<char*> (&a[i]), sizeof(NOTEBOOK));
    i++;
    }
}
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
03.03.2014, 11:54 #14
C++
1
out.write(reinterpret_cast<char*> (&counter), sizeof(a.size()));
В оператор sizeof необходимо передавать размер типа short, а вы передаете size_t.
Цитата Сообщение от dzrkot Посмотреть сообщение
сделал функцию так, в самом бинарнике получаю
4 ђ   pAА] Pentium ию" я" 0 @ ˜ь" @ И  €A N Asus ию" я" 0 @ ˜ь"
*  ˜A { Intel ию" я" 0 @ ˜ь"  8  €AHq Lenovo ию" я" 0 @ ˜ь"
я так поимаю что это норм?))
Нельзя так просто открыть бинарный файл. Впринципе это норма. Для чтения информации из бинарного файла пользуйтесь знанием его структуры.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
03.03.2014, 11:58  [ТС] #15
Цитата Сообщение от Ilot Посмотреть сообщение
Нельзя так просто открыть бинарный файл. Впринципе это норма. Для чтения информации из бинарного файла пользуйтесь знанием его структуры.
ну в задании нету чтения из бинарника, но ради любопытства я попробую читать его и переводить обратно
Цитата Сообщение от Ilot Посмотреть сообщение
В оператор sizeof необходимо передавать размер типа short, а вы передаете size_t.
оу, спасибо))


только как теперь бинарник переводить обратно не представляю
0
03.03.2014, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 11:58
Привет! Вот еще темы с ответами:

Отсортировать структуру по алфавиту - C++
Вообще задание такое: Описать структуру с именем STUDENT, содержащую следующие поля: 1)фамилия и инициалы; 2)номер группы; ...

Как отсортировать структуру? - C++
В чем здесь ошибка? Нужно записать во второй файл структуру, отсортированную по параметру number. #include &quot;stdafx.h&quot; #include...

Как отсортировать структуру - C++
struct Books { char *Nazvan; //название книги char *Name_avtor; //автор int Yaer_izd; // год издания ...

Как отсортировать структуру? - C++
Нужно отсортировать по number, и записать в новый файл. #include &quot;stdafx.h&quot; #include &lt;fstream&gt; #include &lt;stdlib.h&gt; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru