Лекции 1 семестр матанализ. лекции 1 семестр (1). Литература Герберт. Шилдт. С руководство для начинающих
Скачать 1.38 Mb.
|
Запись блоками write //arb2014_binary_read_write_2 //arb2014_binary_get_put #include "stdafx.h" #include #include #include using namespace std; int main() { const int n=80; ifstream in("arb.txt"); ofstream out("out.bin", ios::binary); if(!in) { cout<<"can’t open file! "; system("pause"); exit(1); } char mch[n]; in.getline(mch,80); int k=strlen(mch); in.close(); out.write((char*) mch, k*sizeof(char)); out.close(); ifstream in1("out.bin",ios::binary); if(!in1) { cout<<"can’t open file! "; system("pause"); exit(1); } ofstream out1("out1.txt"); char ch; while(in1.get(ch)) out1< out1< in1.close(); out1.close(); system("pause"); return 0; } Файл arb.txt abc def Kazan State University 123 456 Файл out1.txt abc def Kazan State University 123 456 Записать блоком write и прочитать блоком read //arb2014_binary_read_write_2 #include "stdafx.h" #include #include #include using namespace std; int main() { const int n=80; ifstream in("arb.txt"); ofstream out("out.bin", ios::binary); if(!in) { cout<<"can't open file! "; system("pause"); exit(1); } char mch[n]; in.getline(mch,80); int k=strlen(mch); in.close(); out.write((char*) mch, k*sizeof(char)); out.close(); ifstream in1("out.bin",ios::binary); if(!in1) { cout<<"can't open file!"< system("pause"); exit(1); } ofstream out1("out1.txt"); in1.read((char*)mch, k*sizeof(char)); out1< out1.close(); system("pause"); return 0; } Файл arb.txt abc def Kazan State University 123 456 Файл out1.txt abc def Kazan State University 123 456 Считывание и запись в файл блоков данных Чтобы считывать и записывать в файл блоки двоичных данных, используйте функции-члены read() и write(). Их прототипы имеют следующий вид: istream &read((char*) buf, streamsize num); ostream &write((char*) buf, streamsize num); Функция read() считывает num байт данных из связанного с файлом потока и помещает их в буфер , адресуемый параметром buf. Функция write() записывает num байт данных в связанный с файлом поток из буфера, адресуемого параметром buf. Тип streamsiize определен библиотекой С++ как некоторая разновидность целочисленного типа. При выполнении следующей программы сначала в файл записывается массив целых чисел , а затем он же считывается из файла //arb2014_binary_array_read_write #include "stdafx.h" #include #include #include using namespace std; int main() { const int n=5; int a[n]={1,2,3,4,5}; int i; ofstream out("out.bin", ios::binary); out.write((char*)a, n*sizeof(int)); out.close(); ifstream in("out.bin", ios::binary); if(!in) { cout<<"can't open file!"< system("pause"); exit(1); } for(i=0;i a[i]=0;//очищаем массив in.read((char*)a, n*sizeof(int)); cout<<"array a:"< for(i=0;i cout< cout< in.close(); system("pause"); return 0; } Задачи из методички Гусенкова А.М. Задача 2 Создание двоичного (binary) файла целых чисел. Можно использовать в следующих далее программах в качестве входного файла. //arb2014_binary_gus_9_2 #include "stdafx.h" #include #include using namespace std; int main() { char fname[20]; // // Для ввода имени выходного файла int x; cout << "Enter name of file :"; cin >> fname; // Открытие двоичного файла для вывода. ofstream out(fname, ios::binary); if(!out) // // Если не удалось открыть файл { cout << "Not open file"< system("pause"); exit(1); } cout << "Enter integer numbers. Number 9999 - end of input"< // Ввод целых чисел с экрана терминала и запись в двоичный // файл. // Функция sizeof(int) возвращает количество байт, выделяемых // для размещения числа типа int while(cin>>x && x != 9999) out.write((char*) &x, sizeof(int)); out.close(); // Открытие созданного двоичного файла для ввода. ifstream in(fname, ios::binary); if(!in) { cout << "Not open file"< system("pause"); exit(1); } cout << "Output file :"< // Чтение двоичного файла и вывод его на экран терминала. while( in.read((char*) &x, sizeof(int)) ) cout << x << ' '; cout << endl; in.close(); system("pause"); return 0; } Задача 3 Задан текстовой файл, состоящий из целых чисел. Используя этот файл , создается бинарный файл целых чисел ”file1.bin”. Используется функция create(). Далее осуществляется проверка на правильное чтение с //помощью функции check(). После этого к полученному бинарному файлу дописывается последовательность целых чисел из того же текстового файла. И опять проверка на правильность дописывания. Файл открывается для записи и указатель позиции записи устанавливается в конец файла. Параметр ios::app out1_bin.open("file1.bin",ios::binary | ios::app); // arb2013_gusen_10_3_bin #include "stdafx.h" #include #include #include using namespace std; ////////////////////////// void create(ifstream &f, ofstream &g) { int x; if(!f) { cout << "Can not open file "< system("pause"); exit(1); } while(f>>x) { g.write((char *) &x, sizeof(int)); } } ///////////////////////////////////////// void check(ifstream &f, ofstream &g) { int x; if(!f) { cout << "Can not open file"< system("pause"); exit(1); } while(f.read((char*)&x, sizeof(int))) { g< } g< } //////////////////////////////////////// int main() { ifstream in1("arb.txt"); ofstream out1_bin("file1.bin",ios::binary); create(in1,out1_bin); in1.close(); out1_bin.close(); ifstream in1_bin("file1.bin",ios::binary); ofstream out1("out1.txt"); check(in1_bin,out1); out1.close(); in1_bin.close(); in1.open("arb.txt"); out1_bin.open("file1.bin",ios::binary | ios::app); // Файл открывается для записи и указатель позиции // записи устанавливается // в конец файла. Параметр ios::app create(in1,out1_bin); in1.close(); out1_bin.close(); in1_bin.open("file1.bin",ios::binary); out1.open("out1.txt"); check(in1_bin,out1); out1.close(); in1_bin.close(); system("pause"); return 0; } Задача 10.5 /* Расщепление. Образовать из входного файла целых чисел два новых файла. В один из них поместить все положительные числа, а в другой – все остальные числа. */ // Входной файл можно создать в задаче D2. #include "stdafx.h" #include #include #include using namespace std; int main() { int x; ifstream myin("file.bin", ios::binary); if(!myin) { cout << "Can’t open file file1.bin"< system("pause"); exit(1); } ofstream myout1("file1.bin", ios::binary); // Файл положительных ofstream myout2("file2.bin", ios::binary); // Файл остальных чисел while(myin.read((char *) &x, sizeof(int))) { if(x>0) myout1.write((char *) &x, sizeof(int)); else myout2.write((char *) &x, sizeof(int)); } myout1.close(); myout2.close(); // Вывод созданных файлов на экран терминала // для проверки результата. ifstream myplus("file1.bin", ios::binary); cout << "File of positive numbers"< while (myplus.read((char *) &x, sizeof(int))) cout << x << ' '; cout << endl; ifstream myother("file2.bin", ios::binary); cout << "File of other numbers"< while(myother.read((char *) &x, sizeof(int))) cout << x << ' '; cout < myplus.close(); myother.close(); system("pause"); return 0; } Задача 10.6 Дан двоичный файл целых чисел. Вычислить сумму всех его чисел. Пример чтения чисел в массив. Каждая порция заносится в массив. Входной файл уже создан #include "stdafx.h" using namespace std; #include #include using namespace std; int main() { const int N=5; int x[N], sum, len, i; ifstream myin("file.bin", ios::binary); // Входной файл if(!myin) { cout << "Can’t open file file.bin"< exit(1); } sum = 0; while(!myin.eof()) // Чтение файла в массив. Указано имя массива (без &) { myin.read((char *) x, N*sizeof(int)); // gcount() возвращает количество прочитанных байт. len = myin.gcount()/sizeof(int); for(i=0; i } myin.close(); cout << "Sum =" << sum << endl; system("pause"); return 0; } Задача 11.3 Описать структуру экзаменационной ведомости, содержащую следующие сведения: номер группы; наименование предмета; дата экзамена; фамилия экзаменатора; 9 строк с полями: фамилия студента, номер зачетной книжки, отметка о зачете (есть-1, нет-0), оценка по экзамену (2,3,4,5) Вывести итоговые данные по экзамену (сколько оценок 2,3,4,5) Пример входного файла: 923 мат.анализ 10.06.2006 Сидоров Иванов 11111 1 4 Петров 22222 0 2 Сидоров 33333 1 2 Хайруллин 44444 1 5 Карасиков 55555 1 3 Красоткина 66666 1 3 Умнова 77777 1 5 Либерман 88888 1 4 Акзамова 99999 1 4 //arb2014_gus_11_3_december_2014 #include "stdafx.h" #include #include using namespace std; int main() { struct student // определение типа student { char name[30]; char num_z[6]; int zach; int mark_exam; }; struct vedomost // определение типа vedomost { int group; char predmet[15]; char date[10]; char examenater[15]; student spisok[9]; // тип student яв-ся элементом //типа vedomost } ; vedomost subject1; // описание переменной типа vedomost int i; int marks[4]; // Cчетчик оценок ifstream in("vedomost.txt"); if(!in) { cout << "Can't open file vedomost.txt"< system("pause"); exit(1); } // чтение ведомости из файла in >> subject1.group >> subject1.predmet >> subject1.date >> subject1.examenater; for(i=0; i<9; i++) in >> subject1.spisok[i].name >> subject1.spisok[i].num_z >> subject1.spisok[i].zach >> subject1.spisok[i].mark_exam; // Обнуление счетчиков for(i=0; i<4; i++) marks[i] = 0; // Подсчет оценок for(i=0; i<9; i++) switch (subject1.spisok[i].mark_exam) { case 2 : marks[0]++; break; case 3 : marks[1]++; break; case 4 : marks[2]++; break; case 5 : marks[3]++; break; } ofstream out("out.txt"); out<<" the final performance in the group"< out << "marks 5 " << marks[3] < out<<"marks 4 " << marks[2]< out<< "marks 3 " << marks[1]< out<<"marks 2 " << marks[0] << endl; out.close(); system("pause"); return 0; } Файл out.txt ( перевод итоговая успеваемость в группе ) the final performance in the group marks 5 2 marks 4 3 marks 3 2 marks 2 2 Задача 11.4 Военно-учетный стол. Регистрация студентов. Дан текстовый файл, содержащий следующую информацию о студентах: Фамилия; Номер группы; Служба в армии (служил-1 или нет-0); Если служил, то воинское звание, иначе – возраст. Создать файл записей На основе файла записей сформировать текстовый файл, содержащий сведения о студентах не служивших в армии. (В виде таблицы.) Пример входного файла: Иванов 923 1 солдат Петров 924 0 19 Сидоров 924 1 мл.лейтенант Хайруллин 922 1 сержант Карасиков 924 0 17 Либерман 924 0 25 //arb2014_gus_11_4_december_2014 #include "stdafx.h" #include #include using namespace std; int main() { struct student { char name[30]; int group; int army; union // Аналог записи с вариантами в Pascal { char voin_zv[15]; int age; }; }; student man; ifstream in("student.txt"); if(!in) { cout << "Can't open file student.txt"< exit(1); } // Создание двоичного файла записей ofstream binout("voenkomat.bin",ios::binary); while(!in.eof()) { in >> man.name >> man.group >> man.army; if (man.army) in >> man.voin_zv; else in >> man.age; if(!in.eof()) binout.write((char *) &man,sizeof(struct student)); } binout.close(); // Чтение файла записей ifstream binin("voenkomat.bin",ios::binary); ofstream out("result.txt"); // выходной файл (таблица) // вывод заголовка out << " Список студентов не служивших в армии"< // Ввод записей и печать таблицы while(1) { binin.read((char *) &man,sizeof(struct student)); if (binin.eof()) break; if(!man.army) { /* Форматирование для печати таблицы. width(N) – устанавливает ширину поля вывода равную N. fill(C) – где С –одиночный символ. Устанавливает символ-заполнитель свободных позиций в поле вывода (по умолчанию – пробел). setf(ios::left) – устанавливает выравнивание к левому краю поля вывода (по умолчанию производится выравнивание к правому краю поля вывода). unsetf(ios::left) – отменяет выравнивание к левому краю поля вывода. */ out.width(29); out.fill('-'); out << '-' < out.fill(' '); out.width(1); out << '|'; out.width(15); out.setf(ios::left); out << man.name; out.width(1); out << '|'; out.width(5); out.unsetf(ios::left); out << man.group; out.width(1); out << '|'; out.width(5); out << man.age; out.width(1); out << '|' < out.width(29); out.fill('-'); out << '-' << endl; out.fill(' '); } } system("pause"); return 0; } Файл result.txt Список студентов не служивших в армии ----------------------------- |Петров | 924| 19| ----------------------------- ----------------------------- |Карасиков | 924| 17| ----------------------------- ----------------------------- |Либерман | 924| 25| Реальная зарплата Real salary Задан текстовой файл Строка файла имеет вид 1wwwwwwwwwwww 120 22 33 44 44 55 66 77 88 99 2 2 0.15 ФИО 12 чилел – зарплаты по месяцам и процент кредита Создать структуру salary Поля: -фио – символьная строка -целочисленный массив зарплат -процент по кредиту –тип вещественный -реальная зарплата за год Реальная зарплата вычисляется как сумма зарплат всех месяцев*0.87*(1-credit)/12; Все структуры перенести в бинарный файл. Далее. Переносим структуры из бинарного файла в массив. Размерность масства задается динамически. Упорядочить массив по невозрастанию реальной зарплаты. На экран вывести 5 первых сотрудников. //arb2014_binary_real_salary #include "stdafx.h" #include #include using namespace std; const int n=12; struct salary { char fam[30]; int m[n]; double credit; double real_salary; }; ////////////////////////////// int main() { int i,j, num=0; salary* z; ifstream in("salary.txt"); ofstream out("salary.bin", ios::binary); salary x; if(!in) { cout<<"file not open!"; exit(-1); } while (in) { in>>x.fam; for (i=0; i { in>>x.m[i]; } in>>x.credit; double s=0; for(i=0; i { s=s+x.m[i]; } s=s*0.87*(1-x.credit); x.real_salary=s/12; if(in) { out.write ((char*)&x, sizeof (salary)); num++; } } in.close(); out.close(); z=new salary[num]; ifstream in1("salary.bin", ios::binary); i=0; while (i { i++; } in1.close(); for(i=0; i for(j=i+1; j { if(z[i].real_salary { x=z[i]; z[i]=z[j]; z[j]=x; } } cout<<" high salary 5 employees"< for(i=0; i<5; i++) cout< system("pause"); return 0; } Файл salary.txt 1wwwwwwwwwwww 120 22 33 44 44 55 66 77 88 99 2 2 0.15 2wwwwwwwwwwww 135 22 33 44 44 55 66 77 88 99 2 2 0.15 3wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15 4wwwwwwwwwwww 12 226 33 44 44 55 66 77 88 99 2 2 0.15 5wwwwwwwwwwww 126 225 33 44 44 55 66 77 88 99 2 2 0.15 6wwwwwwwwwwww 12 22 33 44 44 55 66 77 88 99 2 2 0.15 7wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15 8wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15 9wwwwwwwwwwww 12 22 33 446 44 55 66 77 88 99 2 2 0.15 10wwwwwwwwwwww 12 22 33 446 44 55 66 77 88 99 2 2 0.15 12wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15 13wwwwwwwwwwww 12 226 33 44 44 55 66 77 88 99 2 2 0.15 14wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15 15wwwwwwwwwwww 126 22 33 44 44 55 66 77 88 99 2 2 0.15 16wwwwwwwwwwww 126 22 336 644 44 55 66 77 88 99 2 2 0.15 17wwwwwwwwwwww 12 22 336 44 44 55 66 77 88 99 2 2 0.15 Бинарные файлы Прием заявлений и зачисление на ВМК #include "stdafx.h" #include #include #include using namespace std; const int k=3; struct attestat { char FIO[30]; int SC[k];// score for sc[0] - math sc[1]-ph sc[2]-rus int OLIMP;// 1-yes 0 - no }; struct score { char FIO[30]; int SUM_SC; int OLIMP;// 1-yes 0 - no }; ////////////////////////////////////////////////////////////////////////// void show(score* x,int n) { int i; for (i=0;i cout< x[i].SUM_SC< } //////////////////////////////////////////////////////////////////////////// void create_mas(score* x,int n,ifstream &f) { int i; attestat a; if (!f) { cout<<"Can't open file!!!"< system("pause"); exit(-1); } cout< { f.read((char*)&a,sizeof(struct attestat)); strcpy_s(x[i].FIO,a.FIO); x[i].OLIMP = a.OLIMP; x[i].SUM_SC = a.SC[0]+a.SC[1]+a.SC[2]; } f.close(); } //////////////////////////////////////////////////////////////////////////////////// void create_bin_file(ifstream &f, ofstream &g,int &n) { attestat a; n=0; if (!f) { cout<<"Can't open file!!!"< system("pause"); exit(-1); } while(f>>a.FIO>>a.SC[0]>>a.SC[1]>>a.SC[2]>>a.OLIMP ) { if ((a.SC[0]>=60)&&(a.SC[1]>=60)&&(a.SC[2]>=50)) { g.write((char*)&a,sizeof(struct attestat)); n++; } } f.close(); g.close(); } ////////////////////////////////////////////////////////////////////////////////// void show_text_file(ifstream &f) { attestat a; if (!f) { cout<<"Can't open file!!!"< exit(-1); } cout<<"show text file "< while(f>>a.FIO>>a.SC[0]>>a.SC[1]>>a.SC[2]>>a.OLIMP) { cout< } f.close(); } ////////////////////////////////////////////////////////////////////////// void show_bin_file(ifstream &f, ofstream &g) { score a; if (!f) { cout<<"Can't open file!!!"< system("pause"); exit(-1); } g<<"show bin file "< while(f.read((char*)&a, sizeof(score))) { g< } f.close(); g.close(); } ////////////////////////////////////////// void order(score* x, int n) { int i,j; score r; for (i=0;i for (j=i+1;j if (( x[i].SUM_SC < x[j].SUM_SC) || ((x[i].SUM_SC == x[j].SUM_SC) && ( x[i].OLIMP < x[j].OLIMP))) { r= x[i]; x[i]= x[j]; x[j]=r; } } ////////////////////////////////////////////////////////////////////////////////// int main() { setlocale(LC_ALL,"Rus"); int num_abit; int i,j; ifstream VMK_in("priem_VMK.txt"); ofstream VMK_out("priemVMK.bin",ios::binary); create_bin_file(VMK_in,VMK_out,num_abit); ifstream VMK_bin_in("priemVMK.bin",ios::binary); score* mas; mas = new score [num_abit]; VMK_in.open("priem_VMK.txt"); show_text_file(VMK_in); create_mas(mas,num_abit,VMK_bin_in); cout<<"mas ="< show(mas,num_abit); cout<<" Рейтинг. Упорядоченный массив "< order(mas,num_abit); show(mas,num_abit); int plan; cout< cout<<"Введите план приема plan= "; cin>>plan; int dop=0; cout<<" Проходной балл = "< if (mas[plan-1].SUM_SC==mas[plan].SUM_SC) { j=plan; while (j<=num_abit && mas[plan-1].SUM_SC ==mas[j].SUM_SC) { j++; dop++; } } cout<<"Предоставлено дополнительных мест dop= "< ofstream zach("zachislenie.bin",ios::binary); ofstream dop_spisok("dopol.bin",ios::binary); for (i=0;i zach.write((char*) &mas[i], sizeof(score)); for (i=plan;i dop_spisok.write((char*) &mas[i], sizeof(score)); zach.close(); dop_spisok.close(); VMK_bin_in.open("zachislenie.bin",ios::binary); ofstream VMK_out_text("zach.txt"); VMK_out_text<<"Зачисление на ВМК:"< show_bin_file(VMK_bin_in,VMK_out_text); VMK_out_text.open("zach_dop.txt"); VMK_bin_in.open("dopol.bin",ios::binary); VMK_out_text<<"Зачисление на ВМК по дополнительному списку:"< show_bin_file(VMK_bin_in,VMK_out_text); system("pause"); return 0; } Файл priem_VMK.txt 1aaaaaaaaaaaaaaa 61 62 67 1 2aaaaaaaaaaaaaaa 61 62 68 0 3aaaaaaaaaaaaaaa 61 62 69 1 4aaaaaaaaaaaaaaa 61 62 67 0 5aaaaaaaaaaaaaaa 61 62 70 1 6aaaaaaaaaaaaaaa 61 62 75 0 7aaaaaaaaaaaaaaa 61 62 75 1 8aaaaaaaaaaaaaaa 61 62 67 1 9aaaaaaaaaaaaaaa 61 62 27 1 10aaaaaaaaaaaaa 61 62 47 1 11aaaaaaaaaaaaa 61 62 57 1 12aaaaaaaaaaaaaaa 61 62 87 1 13aaaaaaaaaaaaaaa 61 62 97 1 14aaaaaaaaaaaaaaa 61 62 87 0 15aaaaaaaaaaaaaaa 61 62 67 1 16aaaaaaaaaaaaaaa 61 62 67 0 17aaaaaaaaaaaaaaa 61 62 67 1 18aaaaaaaaaaaaaaa 61 62 67 1 Зачисление на ВМК: show bin file 13aaaaaaaaaaaaaaa 220 1 12aaaaaaaaaaaaaaa 210 1 14aaaaaaaaaaaaaaa 210 0 7aaaaaaaaaaaaaaa 198 1 6aaaaaaaaaaaaaaa 198 0 5aaaaaaaaaaaaaaa 193 1 3aaaaaaaaaaaaaaa 192 1 2aaaaaaaaaaaaaaa 191 0 8aaaaaaaaaaaaaaa 190 1 1aaaaaaaaaaaaaaa 190 1 Файл dop_zach.txt Зачисление на ВМК по дополнительному списку: show bin file 15aaaaaaaaaaaaaaa 190 1 17aaaaaaaaaaaaaaa 190 1 18aaaaaaaaaaaaaaa 190 1 4aaaaaaaaaaaaaaa 190 0 16aaaaaaaaaaaaaaa 190 0 |