1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
по идее программа должна иметь две ф-ии: чтение из файла данных для структуры и запись в файл структуры в конец файла.и выполнять следующе:запись в файл информации только о тех ноутбуках ,тактовая частота которых больше 120 МГц,+их нужно отсортировать в порядке возрастания цены.
то,что у меня получилось к сожалению не работает... может посмотрите и исправите какие-то ошибки? заранее благодарна..
#include <iostream.h> #include <fstream.h>
typedef struct tagT { int disp_res_x; //разрешающая способность дисплея по горизонтали int disp_res_y; //по вертикали
Тебе здесь (это С++ программа) лучше всего сделать сортировку не через memmove, а через "operator =", что будет проще и красивей... Тоже самое касается и ввода/вывода: делаешь переопределение "operator <<" и "operator >>" и все прекрасно работает...
Если тебя такое решение устроит, скажи, я помогу (чтоб просто так не делать, вдруг тебе нужно именно так, как ты начала )
А ошибки начинаются с того, что ты из void-функции пытаешься вернуть значение, как это?
честно говоря не знаю что за "operator=".но немного объяснений и я пойму=) ...а с void так вышло,потому что я пыталась ф-ию заставить работать...почему-то не получалось...в общем в итоге я запталась...а теперь вообще не знаю,как ее определить...
Смотри... Ты переопределяешь для класса оператор присваивания, то есть, задаешь действия, которые программа должна выполнить, если ты делаешь, например:
T a, b; a = b; // <--- Вот так...
Как это сделать... Все очень просто:
#include <stdlib.h> #include <string.h>
#include <iostream.h> #include <fstream.h>
// Работаем с классами class T { // Функции "друзья" класса (имеют доступ к защищенным и приватным членам класса)
// Перегрузка операции ввода friend ostream& operator << (ostream &, const T &); // Перегрузка операции вывода friend istream& operator >> (istream &in, T ¬e);
public: // Вот это и есть перегрузка операции присваивания T& operator = (const T ¬e) { disp_res_x = note.disp_res_x; disp_res_y = note.disp_res_y; f = note.f; d = note.d; hdd = note.hdd; price = note.price; strcpy(mode, note.mode); return *this; }
// Конструктор по умолчанию T(char* _model = "", float _price = 0.0, int _f = 0, float _d = 0.0, float _hdd = 0.0, int dx = 0, int dy = 0): price(_price), f(_f), d(_d), hdd(_hdd), disp_res_x(dx), disp_res_y(dy) { strcpy(mode, _model); }
Если что непонятно в логике работы - спрашивай... Вместо вывода на консоль через cout можно открыть ofstream f_out("res.txt") и точно так же направить вывод туда:
f_out << notebook[i];
Чтение происходило вот из этого файла: NOTE.TXT ( 366 байт )
Кол-во скачиваний: 516
(он содержит для каждого ноута следующие данные:
модель, цена, масса, габариты(длина/ширина/высота), тактовая частота CPU, размер памяти, диагональ дисплея, размер видеопамяти, разрешение монитора(X/Y), рабочая частота монитора, размер хард-диска.
если у тебя формат файла данных другой, то придется подправить operator >>)
1. Ты не имеешь права в void-функции возвращать параметры. 2. Для вывода информации должен использоваться ofstream, а не ifstream, как у тебя... 3. В функции f_write ты почему-то ЧИТАЕШЬ из файла, который хочешь открыть на запись...
void f_read() { ifstream fin ("file.txt"); if (!fin) cout << "File file.txt don't found." << endl;
T notebook[20]; int n; fin >> n; for (int i=0;i<n;i++) { fin >> notebook[i].mode >> notebook[i].hdd >> notebook[i].f >> notebook[i].d >> notebook[i].disp_res_x >> notebook[i].disp_res_y >> notebook[i].price; }; };
void f_write() { ofstream fout ("file.txt"); if (!fout) cout << "File can't open for writing." << endl; ifstream fin ("file.txt"); if (!fin) cout << "File file.txt don't found." << endl;
T notebook[20]; int n; int i; fin >> n; fout << notebook[i].mode << notebook[i].hdd << notebook[i].f << notebook[i].d << notebook[i].disp_res_x << notebook[i].disp_res_y << notebook[i].price << endl; };
int main() { ofstream fout ("file.txt"); if (!fout) cout << "File can't open for writing." << endl; ifstream fin ("file.txt"); if (!fin) cout << "File file.txt don't found." << endl;
T notebook[20];
f_read;
int n; fin >> n;
T buf; for (int i=0;i<n;i++) for (int j=n-1;j>=i+1;j--) { if (notebook[j-1].price > notebook[j].price) { memmove (&buf, ¬ebook[j-1], sizeof(T)); memmove (¬ebook[j-1],¬ebook[j], sizeof(T)); memmove (¬ebook[j], &buf, sizeof(T)); }; };
for (int i=0;i<n;i++) { if (notebook[i].f>120) f_write; }; }
а файл почему-то становится пустым.почему так происходит?
Ну, запускается -то оно запускается, только вот ЧТО оно делает?
По пунктам: 1) ты описала свою копию массива notebook И в f_read И в f_write И в main... И работаешь в каждой функции со своей копией массива. А они что, как-то взаимосвязаны? Увы, они существуют только до тех пор, пока выполняется процедура... Тебе нужен здесь глобальный массив... 2) то же самое касается и переменной n 3) аналогично - с файлом. Ты открываешь в каждой функции свою копию? Напрасно, открывай для ввода одну, в f_read, больше она тебе нигде не нужна, а для вывода - открывай в main и передавай как параметр... 4) То, что ты вызываешь f_read/f_write без (), на компилятор как-то не производит впечатления, синтаксис требует со скобками 5) я бы все-таки для вывода создавал файл с другим именем...
Вот, смотри этот вариант:
#include <iostream.h> #include <fstream.h>
typedef struct tagT { int disp_res_x; int disp_res_y;
а как быть ,если нужно работать с бинарными файлами?
"Меня терзают смутные сомнения..." (С) Я делал точно такую же задачу про ноутбуки в прошлом году... Вот это выдрано оттуда (запись в бинарный файл/чтение из него):
fstream bin("note.bin", ios::in|ios::out|ios::binary); for(int i = 0; i < 10; i++) { // как-то получаешь содержимое очередного эл-та массива, например, вводишь с клавиатуры: note[ i ] write(bin, note[ i ]); // и пишешь его в бинарный файл ... }
bin.seekg(2, ios::beg); // читаешь из бинарного файла очередное значение note[ i ] while(read(bin, note[ i ])) { // Выводишь на экран note[ i ] } ...
воспользовалась вашими функциями.вроде довольно успешно. но программа записывает в файл то,что вводится с клавиатуры,а потом ничего больше не происходит. почему такое происходит?
#include <iostream.h> #include <fstream.h>
typedef struct tagT { int disp_res_x; int disp_res_y;
я вот попробовала написать ф-ии вот так,но заступорилась на функции для считывания. да и то,что написано выше...там я пытаюсь первые 2 байта файла читать как размерность массива структуры. +мне же нужно ДОписывать в файл полученные данные после выполнения программы... я совсем запуталась(( очень прошу о помощи.
int append_data(const Notebook ¬e,const char* filename) { FILE *fout; if ((fout=fopen(filename,"ab")) == null) return 1; int success=fwrite(¬e,sizeof(note),1,fout); fclose(fout); if (success==1) return 0; else return 2; }
int print_data(const char * filename) { int num; Notebook note; FILE *f; if ((f=fopen(filename,"rb"))==null) return 1; fseek(f,0,seek_end); int n_record=ftell(f)/sizeof(note); while (true) { for (int i=0;i<n;i++) { fseek(f,i*sizeof(note),seek_set); fread(¬ebook.sizeof(note),1,f); printf("%30s%5i%10,2f\n", note.disp_res_x,note.disp_res_y,note.f,note.d,note.hdd,note.mode,note.price); } } return 0; }
программа записывает в файл то,что вводится с клавиатуры,а потом ничего больше не происходит. почему такое происходит?
Потому, что перед чтением из файла:
while (read(bin,notebook[i])) ...
нужно опять перебросить stream position на начало, как ты уже делала раньше:
bin.seekg(2, ios::beg);
Если этого не сделать, то из потока ничего читаться не будет, т.к. после записи в него указатель находится в самом конце потока...
Это первое...
Второе - расскажи мне, зачем тебе внешний цикл for? У тебя же есть цикл while, который будет читать данные до тех пор, пока файл не закончится, а в твоем случае чтение будет происходить на итерации i=0 и ВСЕ данные будут записаны в нулевую ячейку массива, остальные заполнены не будут (я о программе из поста №13)...
спасибо,конечно, но мне это к сожалению не помогло... всё равно получается так,что идет запрос на заполнение файла,я ввожу данные,после чего больше ничего не происходит.=(
Присоедини сюда окончательный вариант программы, с которым работаешь (лучше - в аттач), и полностью напиши те данные, которые вводишь, в какой последовательности ты это делаешь, и ЧТО ИМЕННО ты хочешь, чтобы при этом происходило...
я ввожу кол-во записей,затем по порядку все поля записи. затем всё это по идее должно писаться в бинарный файл. далее я сортирую массив записей по возрастанию цен,так как затем мне нужно результат вывести именно таким образом. затем я ввожу условие частота>120.если оно выполняется,запись пишется в конец бинарного файла. после всего этого хотелось бы,чтобы результат был выведен на экран.
хммм...а ведь у меня в программе получается должен выводиться весь файл. ух...кажется,я совсем запуталась=(
), оно даже и записывалось бы в файл... А так - у тебя ничего не пишется, файл note.bin остается пустым...
Второе: ДАЖЕ если ты запишешь в файл всю информацию, введенную в начале, что должно происходить потом? Сортировка, хорошо... Дальше? Запись данных, удовлетворяющих определенному критерию, в тот же файл? А что с ПРЕЖНИМИ данными? Новые же будут добавляться, так реализована функция write...
Выходов 2... Или после сортировки стереть все, что было из файла note.bin, и потом записывать только то, что удовлетворяет критерию, или работать с 2-мя файлами: в одном - полная информация, во втором отфильтрованная...
Учти также, что при последовательных запусках программы содержимое твоего файла будет накапливаться (из него ничего нигде не удаляется), так что нужно либо при старте программы спрашивать, что делать (удалять старую информацию/не удалять), либо делать что-то другое, но не оставлять это просто так...