Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фаил+функции, Помогите доделать функцию 
:(
    Опции темы
Кит
Дата 22.5.2005, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 21.5.2005

Репутация: нет
Всего: нет



Помогите пожалуйста доделать программу!!!
Задание такое:
Для хранения данных о ноутбуках описать структуру вида:
struct NOTEBOOK{
struct disp_res{ // разрешающая способность дисплея
int x; // по горизонтали
int у; // по вертикали
};
int f; // частота регенерации
float d; // размер диагонали дисплея
float hdd; // объем диска
char model[21]: // наименование
}
Нужно написать функцию, которая читает данные о ноутбуках из файла note.txt
в структуру приведенного вида. Написать функцию, которая записывает
содержимое структуры в конец бинарного файла. Структура бинарного
файла: первые два байта — целое число записей в файле; далее записи
в формате структуры NOTEBOOK.
На основе разработанных функций осуществляется запись в двоичный
файл данных только о тех ноутбуках, тактовая частота процессора которых
больше 120МГц, отсортированные в порядке возрастания цены.

Помогите доделать последний пункт задания:

Осуществить запись в двоичный файл данных только о тех ноутбуках,
тактовая частота процессора которых больше 120МГц, отсортированные в порядке
возрастания цены.


Вот, что у меня получилось с программой кроме последнего пункта:
Файл note.txt содержит например такую информацию:

Aser Note Light 2699 5.6 02.0x11.8x08.3 100 40 10.4 1 1024x0768 60 0.774

ASW ND5123T 3489 7.2 02.3x11.8x10.1 133 32 12.1 2 1024x0768 70 1.300

ARMNote TS80CD 3699 7.2 02.0x11.5x08.8 133 64 11.3 1 1024x0768 75 1.300

где каждая строка содержит данные об одной модели.
Данные в строке размещаются в следующих полях:
1: 20 — наименование модели;
21: 24 — цена в долларах (целое число);
26: 28 — масса ноутбука в кг (число с десятичной точкой из четырех символов);
30: 43 — габаритные размеры ноутбука в дюймах (ВЫСОТАхДЛИНАхШИРИНА —
три числа с десятичной точкой (4 символа, включая точку, разделенные 'х');
44: 47 — частота процессора в МГц (целое число из трех символов);
49:50 — максимальный объем ОЗУ в мегабайтах (целое число из двух символов);
52:55 — размер диагонали дисплея в дюймах (число с десятичной точкой из четырех
символов, включая точку);
57 — размер видеопамяти в мегабайтах — целое число из одного символа;
59: 67 — разрешающая способность дисплея в пикселах (два целых числа, разделенные 'х');
69: 70 — частота регенерации дисплея в Гц (целое число из двух символов);
72: 76 — объем HDD в гигабайтах (число с десятичной точкой из пяти символов).
Все неописанные позиции заполнены пробелами.

Все эти данные распологаются на 3 (их конечно будет больше) строках
соответственно

Код

#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>

#include <conio.h>
#include <string.h>
#include <stdlib.h>

struct TNotebook
{
    struct disp_res       // разрешающая способность дисплея 
    {
        int x;                 // по горизонтали 
       int у;           // по вертикали
    } disp;
    int     f;                  // частота регенерации дисплея 
    float   d;                 // размер диагонали
    float   hdd;             //объем диска
    char    model[21];  //название модели
};

istream& operator >> (istream &in, TNotebook мe) {
  const int bufSize = 15;
  char buffer[bufSize + 1];

  float T;
  char ch;

  // 1. Чтение модели
  for(int i = 0; i < bufSize; ++i) {
    in.get(ch);
    if(ch == '\t') break;
    buffer[i] = ch;
  }

  buffer[i] = '\0';
  strcpy(note.model, buffer);

  // переход на цену, массу
  for(i = 0; i < 2; ++i) in >> T;
  // Переход на размеры
  for(i = 0; i < 15; ++i)
    in.get(buffer[i]); buffer[15] = '\0';
  // переход на MHz, ОЗУ
  for(i = 0; i < 2; ++i) in >> T;

  // Чтение disp diag
  in >> note.d;

  // Переход на видеопамяти
  in >> T;

  // Чтение разреш. способности
  in.get(ch);
  for(i = 0; i < 4; ++i)
    in.get(buffer[i]); buffer[4] = '\0';
  note.disp.x = atoi(buffer);

  in.get(ch);
  for(i = 0; i < 4; ++i)
    in.get(buffer[i]); buffer[4] = '\0';
  note.disp.y = atoi(buffer);

  // Чтение частоты регенерации, HDD
  in >> note.f >> note.hdd;
  // Добрались до "\n" символа
  in.get(ch);

  return in;
}

ostream& operator << (ostream &out, const TNotebook мe) {
  out << note.disp.x << ' ' << note.disp.y << ' '
      << note.f      << ' ' << note.d      << ' '
      << note.hdd    << ' '
      << note.model  << endl;
  return out;
}

istream& read(istream &in, TNotebook мe)
{
    return in.read((char*)мe, sizeof(note));
}
iostream& write(iostream &io, const TNotebook мe)
{
    union
    {
    unsigned value;
    char     buf[2];
    } size = {0};

    io.seekg(0, ios::beg);
    io.read(size.buf, sizeof(size.buf));
    io.clear();

    ++size.value;
    io.seekp(0, ios::beg);
    io.write(size.buf, sizeof(size.buf));

    io.seekp(0, ios::end);
    io.write((const char*)мe, sizeof(note));
    return io;
}

void main()
{
    TNotebook note;
    ifstream f_in("NOTE.TXT");
    if(!f_in) {
      cerr << "error opening file" << endl;
      exit(-1);
    }

    fstream bin("note.bin", ios::in|ios::out|ios::binary);
    while(f_in >> note) {
      write(bin, note);
    }

    bin.seekg(2, ios::beg);
    while(read(bin, note)) {
      cout << note << endl;
    }
    getch();
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.