по идее программа должна иметь две ф-ии: чтение из файла данных для структуры и запись в файл структуры в конец файла.и выполнять следующе:запись в файл информации только о тех ноутбуках ,тактовая частота которых больше 120 МГц,+их нужно отсортировать в порядке возрастания цены.
то,что у меня получилось к сожалению не работает...
может посмотрите и исправите какие-то ошибки?
заранее благодарна..
#include <iostream.h>
#include <fstream.h>
typedef struct tagT
{
int disp_res_x; //разрешающая способность дисплея по горизонтали
int disp_res_y; //по вертикали
int f; //тактовая частота
float d; //размер диагонали дисплея
float hdd; //объем жесткого диска
char mode [20]; //наименование
float price; //цена
}T;
void f_read(T notebook[20])
{
ifstream fin ("file.txt");
if (!fin)
{
cout << "File file.txt don't found." << endl;
return 1;
};
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;
};
return;
};
void f_write(T notebook[20],int i)
{
ifstream fout ("file.txt");
if (!fout)
{
cout << "File can't open for writing." << endl;
return 1;
};
int n;
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;
return;
};
int main()
{
T notebook[20];
f_read(notebook[20]);
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(notebook[20],i);
};
}
честно говоря не знаю что за "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);
}
int disp_res_x;
int disp_res_y;
int f;
float d;
float hdd;
char mode[20];
float price;
};
istream& operator >> (istream &in, T ¬e) {
const int bufSize = 15;
char buffer[bufSize + 1];
float T;
char ch;
// 1. Reading model
for(int i = 0; i < bufSize; ++i) {
in.get(ch);
if(ch == '\t') break;
buffer[i] = ch;
}
buffer[i] = '\0';
strcpy(note.mode, buffer);
in >> note.price; // read price
in >> T; // skip mass
// Skip gabarites
for(i = 0; i < 15; ++i)
in.get(buffer[i]); buffer[15] = '\0';
in >> note.f; // read CPU freq
in >> T; // Skip memory size
in >> note.d; // reading disp diag
in >> T; // Skip videomemory
// Reading resolution
in.get(ch);
for(i = 0; i < 4; ++i)
in.get(buffer[i]); buffer[4] = '\0';
note.disp_res_x = atoi(buffer);
in.get(ch);
for(i = 0; i < 4; ++i)
in.get(buffer[i]); buffer[4] = '\0';
note.disp_res_y = atoi(buffer);
in >> T; // Skip monitor freq, read HDD
in >> note.hdd; // read HDD
// Get the "\n" symbol
in.get(ch);
return in;
}
ostream& operator << (ostream &out, const T ¬e) {
out << note.disp_res_x << ' ' << note.disp_res_y << ' '
<< note.f << ' ' << note.d << ' '
<< note.hdd << ' '
<< note.mode << endl;
return out;
};
int main()
{
const int n = 5;
T notebook[n];
cout << "starting..." << endl;
ifstream f_in("NOTE.TXT");
if(!f_in) {
cerr << "error opening file" << endl;
exit(-1);
}
for(int i = 0; i < n; ++i)
f_in >> notebook[i];
for(i = 0;i < n; i++)
for(int j = n-1; j >= i+1; j--) {
if (notebook[j-1].price > notebook[j].price) {
T buf = notebook[j - 1];
notebook[j - 1] = notebook[j];
notebook[j] = buf;
}
}
for(i = 0; i < 5; i++)
if(notebook[i].f > 120)
cout << notebook[i];
return 0;
}
f_out << notebook[i];
в принципе...я могу с этим разобраться...видимо это действительно гораздо проще...
но дело в том,что по заданию классы использовать нельзя...
может всё-же попробовать исправить то,что у меня получилось?
или там совсем всё плохо?
Ну, нельзя классы, так поменяй class на struct - будешь работать со структурами... В C++ это равнозначно...
ок...
нет,ну всё равно ... что не так с моей программой если конкретно?
Если конкретно - то я тебе уже сказал:
1. Ты не имеешь права в void-функции возвращать параметры.
2. Для вывода информации должен использоваться ofstream, а не ifstream, как у тебя...
3. В функции f_write ты почему-то ЧИТАЕШЬ из файла, который хочешь открыть на запись...
Пока исправляй это, потом посмотрим...
теперь программа даже запускается)
так вот...а файл почему-то становится пустым.почему так происходит?
#include <iostream.h>
#include <fstream.h>
typedef struct tagT
{
int disp_res_x; //разрешающая способность дисплея по горизонтали
int disp_res_y; //по вертикали
int f; //тактовая частота
float d; //размер диагонали дисплея
float hdd; //объем жесткого диска
char mode [20]; //наименование
float price; //цена
}T;
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;
};
}
#include <iostream.h>
#include <fstream.h>
typedef struct tagT
{
int disp_res_x;
int disp_res_y;
int f;
float d;
float hdd;
char mode [20];
float price;
} T;
int n;
T notebook[20];
void f_read()
{
ifstream fin ("N.txt");
if (!fin) cout << "File file.txt don't found." << endl;
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(ostream &fout, int i)
{
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 ("NOut.txt");
if (!fout) cout << "File can't open for writing." << endl;
f_read();
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 (i=0;i<n;i++)
{
if (notebook[i].f>120) f_write(fout, i);
};
return 0;
}
в общем я решила всё же сделать вот так...
а как быть ,если нужно работать с бинарными файлами?
#include <iostream.h>
#include <fstream.h>
typedef struct tagT
{
int disp_res_x; //разрешающая способность дисплея по горизонтали
int disp_res_y; //по вертикали
int f; //тактовая частота
float d; //размер диагонали дисплея
float hdd; //объем жесткого диска
char mode [20]; //наименование
float price; //цена
}T;
int n;
T notebook[20];
void f_read()
{
ifstream fin ("Note.txt");
if (!fin) cout << "File file.txt don't found." << endl;
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, int i)
{
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 ("NoteOut.txt");
if (!fout) cout << "File can't open for writing." << endl;
f_read();
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(fout,i);
};
return 0;
}
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;
}
...
// В функции main():
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;
int f;
float d;
float hdd;
char mode [20];
float price;
}T;
T notebook[20];
istream& read(istream &in, T ¬ebook)
{
return in.read((char*)¬ebook, sizeof(notebook));
}
iostream& write(iostream &io, const T ¬ebook)
{
union
{
unsigned value;
char buf[2];
} size = {0};
io.seekg(0, ios::beg);
io.read(size.buf, sizeof(size.buf));
io.write((const char*)¬ebook, sizeof(notebook));
return io;
}
iostream& write(iostream &io, int)
{
union
{
unsigned value;
char buf[2];
} size = {0};
io.seekg(0, ios::beg);
io.read(size.buf, sizeof(size.buf));
io.write((const char*)¬ebook, sizeof(notebook));
return io;
}
int n;
int main()
{
fstream bin("note.bin", ios::in|ios::out|ios::binary);
cout << "Number of notes:";cin >> n;
write(bin,n);
for(int i = 0; i < n; i++)
{
cout << "Note#" << i+1;
cout << "name:";cin >> notebook[i].mode;
cout << "chastota:";cin >> notebook[i].f;
cout << "diagonal:";cin >> notebook[i].d;
cout << "hdd:";cin >> notebook[i].hdd;
cout << "displey resolution:";cin >> notebook[i].disp_res_x;
cout << "x";cin >> notebook[i].disp_res_y;
cout << "price:";cin >> notebook[i].price;
write(bin,notebook[i]);
}
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));
};
};
bin.seekg(2, ios::beg);
for (int i=0;i<n;i++)
{
if (notebook[i].f>120) write(bin,notebook[i]);
}
for (int i=0;i<n;i++)
{
while (read(bin,notebook[i]))
{
cout << "Note#" << i;
cout << "name:" << notebook[i].mode << endl;
cout << "chastota:" << notebook[i].f << endl;
cout << "diagonal:" << notebook[i].d << endl;
cout << "hdd:" << notebook[i].hdd << endl;
cout << "displey resolution:" << notebook[i].disp_res_x;
cout << "x" << notebook[i].disp_res_y << endl;
cout << "price:" << notebook[i].price << endl;
};
}
}
помогите..
не могу найти ошибку...=(
я вот попробовала написать ф-ии вот так,но заступорилась на функции для считывания.
да и то,что написано выше...там я пытаюсь первые 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])) ...
bin.seekg(2, ios::beg);
спасибо,конечно,
но мне это к сожалению не помогло...
всё равно получается так,что идет запрос на заполнение файла,я ввожу данные,после чего больше ничего не происходит.=(
Присоедини сюда окончательный вариант программы, с которым работаешь (лучше - в аттач), и полностью напиши те данные, которые вводишь, в какой последовательности ты это делаешь, и ЧТО ИМЕННО ты хочешь, чтобы при этом происходило...
я ввожу кол-во записей,затем по порядку все поля записи.
затем всё это по идее должно писаться в бинарный файл.
далее я сортирую массив записей по возрастанию цен,так как затем мне нужно результат вывести именно таким образом.
затем я ввожу условие частота>120.если оно выполняется,запись пишется в конец бинарного файла.
после всего этого хотелось бы,чтобы результат был выведен на экран.
хммм...а ведь у меня в программе получается должен выводиться весь файл.
ух...кажется,я совсем запуталась=(
Прикрепленные файлы
main.rar ( 794 байт )
Кол-во скачиваний: 200
iostream& write(iostream &io, const TNotebook ¬e)), оно даже и записывалось бы в файл... А так - у тебя ничего не пишется, файл note.bin остается пустым...
получается нужна полная функция...хорошо,так и сделаем...
дело в том,что в задании у меня сказано,что нужно дописать результаты в конец файла.
только вот действительно нет смысла в этом.ведь потом когда я допустим буду выводить содержимое файла на экран,будет выводится всё скопом,что не есть хорошо.
мне кажется ,что всё же стоит очищать файл и писать туда эл-ты структуры,соответствующие критерию.
правда,я не знаю как это делается
bin.close();перед сортировкой... Но тогда у тебя совершенно пропадает смысл вообще записывать ВСЕ данные в файл. Они, конечно, будут записаны, только тут же удалятся, и перепишутся отфильтрованными данными. Лучше просто читай изначально в массив (без
bin.open("note.bin", ios::in|ios::out|ios::binary|ios::trunc);
write(bin,notebook[i]);), а уже то, что подходит под критерий записывай в файл...
решила я всё-таки не стирать ничего из файла.
а при выводе когда i=кол-ву изначальных записей,выводить слово result,
а потом отсортированную инф-ию.
НО на экран у меня выводится полный бред=(куча ноликов...а того,что нужно нет.
что же делать?
#include <iostream.h>
#include <fstream.h>
typedef struct tagT
{
int disp_res_x;
int disp_res_y;
int f;
float d;
float hdd;
char mode [20];
float price;
}T;
T notebook[20];
istream& read(istream &in, T ¬ebook)
{
return in.read((char*)¬ebook, sizeof(notebook));
}
template <class T> iostream& write(iostream &io, T)
{
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*)¬ebook, sizeof(notebook));
return io;
}
int n;
int main()
{
fstream bin("note.bin", ios::in|ios::out|ios::binary);
bin.close();
bin.open("note.bin", ios::in|ios::out|ios::binary|ios::trunc);
cout << "Number of notes:";cin >> n;
write(bin,n);
for(int i = 0; i < n; i++)
{
cout << "Note#" << i+1;
cout << "name:";cin >> notebook[i].mode;
cout << "chastota:";cin >> notebook[i].f;
cout << "diagonal:";cin >> notebook[i].d;
cout << "hdd:";cin >> notebook[i].hdd;
cout << "displey resolution:";cin >> notebook[i].disp_res_x;
cout << "x";cin >> notebook[i].disp_res_y;
cout << "price:";cin >> notebook[i].price;
write(bin,notebook[i]);
}
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));
};
};
bin.seekg(2, ios::beg);
for (int i=0;i<n;i++)
{
if (notebook[i].f>120) write(bin,notebook[i]);
}
bin.seekg(2, ios::beg);
int i;
i=0;
while (read(bin,notebook[i]))
{
cout << notebook[i].mode <<"--"<< notebook[i].f <<"--"<< notebook[i].d <<
"--"<< notebook[i].hdd <<"--"<< notebook[i].disp_res_x<<"--"<<
notebook[i].disp_res_y <<"--"<< notebook[i].price<<"--"<< endl;
i++;
if (i==n) cout << "result:" <<endl;
};
}
Да что же тебя так тянет КАЖДЫЙ РАЗ менять что-то кардинально в программе??? Формат вывода зачем изменила? Чего теперь удивляешься, что одни циферки? Ты ж их и выводишь!!! Вот раньше был нормальный вывод...
Зачем тебе понадобилось добавить template <class T> перед описанием функции write? Чтоб программа перестала соответствовать Стандарту? Убери это... Вот так должен выглядеть заголовок write:
iostream& write(iostream &io, const T ¬ebook)Чтобы теперь программа компилировалась, нужно убрать строку
{
...
}
cout << "Number of notes:";cin >> n;(запись размера происходит автоматически при вызове write)
// write(bin,n); // <--- Вот эту
streampos mark = bin.tellg(); // Запоминаем позицию, в которой находились ДО фильтрации
bin.seekg(2, ios::beg);
for (int i=0;i<n;i++) // Фильтруем файл
{
if (notebook[i].f>120) write(bin,notebook[i]);
}
// И восстанавливаем ту позицию, которую сохранили... Теперь
// будут читаться только данные, удовлетворяющие твоему условию...
bin.seekg(mark, ios::beg);
i=0;
while (read(bin,notebook[i]))
{
cout << "Note#" << i+1;
cout << "name:" << notebook[i].mode << endl;
cout << "chastota:" << notebook[i].f << endl;
cout << "diagonal:" << notebook[i].d << endl;
cout << "hdd:" << notebook[i].hdd << endl;
cout << "displey resolution:" << notebook[i].disp_res_x;
cout << "x" << notebook[i].disp_res_y << endl;
cout << "price:" << notebook[i].price << endl;
i++;
};
огромное спасибо за уделённое время и помощь!