Скачать презентацию Стрикелева Л В Программирование Основы системы ввода-вывода Файлы Скачать презентацию Стрикелева Л В Программирование Основы системы ввода-вывода Файлы

вв_выв_примеры.ppt

  • Количество слайдов: 31

Стрикелева Л. В. Программирование Основы системы ввода-вывода. Файлы (примеры) Стрикелева Л. В. Программирование Основы системы ввода-вывода. Файлы (примеры)

Основы системы ввода-вывода int write_to_text_file (ofstream& ); int read_text_file(ifstream&); Передача файла в функцию const Основы системы ввода-вывода int write_to_text_file (ofstream& ); int read_text_file(ifstream&); Передача файла в функцию const int len = 81; int main() {char *filename = "qqqqq. txt"; ofstream fout (filename, ios: : out ); //ofstream fout; //fout. open(filename, ios: : out ); if (!fout) { cout << "Error" << endl; _getch(); return 1; } write_to_text_file (fout); fout. close(); ifstream fin (filename, ios: : in ); if (!fin) { cout << "Error" << endl; _getch(); return 1; } read_text_file(fin); _getch(); return 0; Л. В. Стрикелева Программирование } 2

Основы системы ввода-вывода int write_to_text_file (ofstream & fout) { char line[len]; cout << Основы системы ввода-вывода int write_to_text_file (ofstream & fout) { char line[len]; cout <<"line or Ctrl+z? : "<< endl; while (cin. getline (line, len)) { fout << line ; fout. put ('n'); } return 0; } int read_text_file (ifstream & fin) { char line[len]; while (!fin. eof()) { fin >> line; if (fin. eof()) break; cout << line << endl; } return 0; } Л. В. Стрикелева Программирование Передача файла в функцию Вывод в файл Чтение из файла 3

Поиск подстроки в текстовом файле Основы системы ввода-вывода Исходные данные и результаты: Текстовый файл Поиск подстроки в текстовом файле Основы системы ввода-вывода Исходные данные и результаты: Текстовый файл text. txt состоит из строк (<= 80 символов каждая). Определить, встречается ли в файле заданная последовательность символов (не содержащая пробельных символов). Результат работы программы: сообщение о наличии либо об отсутствии заданной последовательности. Алгоритм решения задачи: • текст из файла считывать построчно ; • для каждой строки проверять наличие в ней заданной последовательности; • если да, то вывод сообщения о наличии последовательности и завершение программы; • при просмотре в цикле всего файла, вывод сообщения об отсутствии последовательности и завершение программы. Исходный текстовый файл для работы программы может быть подготовлен различными способами (программно или в текстовом редакторе). Л. В. Стрикелева Программирование 4

Основы системы ввода-вывода const int len = 81; void poisk(ifstream& fin, char* word); int Основы системы ввода-вывода const int len = 81; void poisk(ifstream& fin, char* word); int main() { char word[len]; //искомая последовательность cout << "Input word: "; cin >> word; ifstream fin ("text. txt", ios: : in ); if (!fin) { cout << "Error" << endl; _getch(); return 1; } poisk (fin, word); //вызов функции поиска _getch(); return 0; } Л. В. Стрикелева Программирование 5

Основы системы ввода-вывода void poisk(ifstream& fin, char* word) { char line[len]; while (fin. getline Основы системы ввода-вывода void poisk(ifstream& fin, char* word) { char line[len]; while (fin. getline (line, len)) { if (strstr(line, word)) { cout << "YES! " << return; } } cout << "NO!" << endl; return; } word << endl; Для тестирования программы следует: 1) проверить ввод слова и успешность открытия файла; 2) задать имя несуществующего файла для проверки вывода сообщения об ошибке; 3) проверить цикл чтения из файла и вывод прочитанной строки; 4) запустить программу, по крайней мере, два раза: введя с клавиатуры слово, содержащееся в файле, и слово, которого в нем нет; 6 Л. В. Стрикелева Программирование

Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле Последовательность шагов написания программы: Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле Последовательность шагов написания программы: 1. Введем «скелет» программы const int len = 81; int main() { char word[len]; cout << "Input word: "; cin >> word; ifstream fin ("text. txt", ios: : in); if (!fin) { cout << "Error. " << endl; _getch(); return 1; } _getch(); return 0; } Л. В. Стрикелева Программирование //искомое слово 7

Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле 2. Добавим в программу Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле 2. Добавим в программу определение и вызов функции count_word() const int len = 81; int count_word(ifstream& fin, char * word); int main() { char word[len]; cout << "Input word: "; cin >> word; ifstream fin ("text. txt", ios: : in); if (!fin) { cout << "Error " << endl; _getch(); return 1; int count_word(ifstream& fin, char * } word) count_word(fin, word); _getch(); return 0; } Л. В. Стрикелева Программирование { //тело функции содержит пока 1 оператор cout << word << endl; return; } 8

Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле 3. Добавим в функцию Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле 3. Добавим в функцию count_word() цикл чтения из файла, внутри которого поместим цикл поиска последовательности символов int count_word(ifstream& fin, char * word) { char line[len]; int l_word= strlen(word); int count =0; while (fin. getline(line, len)) { //цикл чтения строки из файла char *p = line; while (p=strstr(p, word)) { //цикл поиска слова в строке cout << "YES! " << p << endl; p+=l_word; //продвижение по строке count++; } } return count; } Л. В. Стрикелева Программирование 9

Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле 4. Добавим в функцию Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле 4. Добавим в функцию count_word() анализ принадлежности символов, находящихся перед словом и после него, множеству знаков пунктуации и разделителей. int count_word(ifstream& fin, char * word) { char line[len]; int l_word= strlen(word), count =0; while (fin. getline(line, len)) {char *p = line; while (p=strstr(p, word)) { char *c=p; p+=l_word; if (c!=line) //слово не в начале строки //символ перед словом не разделитель if(!ispunct(*(c-1) )&& !isspace(*(c-1) )) continue; //символ перед словом разделитель, проверяем символ после слова if (ispunct(*p) || isspace(*p) || (*p == '')) count++; } } return count; } Л. В. Стрикелева Программирование 10

Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле Тестирование программы Для тестирования Основы системы ввода-вывода Подсчет количества повторений слова в текстовом файле Тестирование программы Для тестирования программы требуется создать файл с текстом, в котором заданное слово встречается: • в начале строки; • в конце строки; • в середине строки; • несколько раз в одной строке; • как часть других слов, находящаяся в начале, середине и в конце этих слов; • в скобках, кавычках и других разделителях. Длина хотя бы одной из строк должна быть равна 80 символам. Программу следует запустить для разных файлов, по крайней мере, два раза: введя с клавиатуры слово, содержащееся в файле, и слово, которого в нем нет. Л. В. Стрикелева Программирование 11

Основы системы ввода-вывода решение задачи с функцией strtok: Подсчет количества повторений слова в текстовом Основы системы ввода-вывода решение задачи с функцией strtok: Подсчет количества повторений слова в текстовом файле int count_word(ifstream& fin, char * word) { char delims[] = ", . !? /<>|)(*: ; ""; char line[len]; int l_word= strlen(word); char *token; int count =0; while (fin. getline(line, len)) { token=strtok(line, delims); while (token !=NULL) { if (!strcmp (token, word)) count++; token=strtok(NULL, delims); } } return count; } Л. В. Стрикелева Программирование рассмотрим только функцию count_word() 12

Основы системы ввода-вывода Поиск в массиве структур Исходные данные и результаты: В текстовом файле Основы системы ввода-вывода Поиск в массиве структур Исходные данные и результаты: В текстовом файле хранится база данных отдела кадров предприятия (100 сотрудников). Каждая строка файла – запись об одном сотруднике. Формат записи: фамилия и инициалы (30 позиций), год рождения (5 позиций), оклад (10 позиций). Написать программу, которая по заданной фамилии выводит на экран сведения о сотруднике, подсчитывая средний оклад всех запрошенных сотрудников. Алгоритм решения задачи: • Ввести из файла в массив сведения о сотрудниках. • Организовать цикл вывода сведений о сотруднике (для выхода из цикла условимся вместо фамилии вводить слово end): -ввести с клавиатуры фамилию; -выполнить поиск сотрудника в массиве; -увеличить суммарный оклад и счетчик количества сотрудников; -вывести сведения о сотруднике или сообщение об их отсутствии; • Вывести средний оклад. Л. В. Стрикелева Программирование 13

Основы системы ввода-вывода Поиск в массиве структур Так как поиск по базе будет выполняться Основы системы ввода-вывода Поиск в массиве структур Так как поиск по базе будет выполняться многократно, всю информацию из файла будем хранить в памяти одновременно (многократное чтение из файла в данном случае нерационально). В противном случае (если бы сведения о сотруднике запрашивались однократно) можно было бы обойтись буфером на одну строку. Выделим для хранения строк файла массив dbase из 100 элементов-структур. Файл для целей тестирования должен состоять из нескольких строк, причем необходимо предусмотреть случай, когда одна фамилия является частью другой (например, Петровский). Необходимо проверить и случай, когда файл не найден (выдается ли диагностическое сообщение). Файл dbase. txt создаем в блокноте в виде: Иванов 1980 1500000 Сидоров 1984 2000000 Петровский 1967 3500000 1________301____51____10 Л. В. Стрикелева Программирование 14

Основы системы ввода-вывода Поиск в массиве структур const int l_name = 30, l_year =5, Основы системы ввода-вывода Поиск в массиве структур const int l_name = 30, l_year =5, l_pay = 10, l_buf = l_name + l_year + l_pay+1; const int l_dbase = 100; // размер базы //структура Man для хранения сведений об одном сотруднике struct Man { char name [l_name+1]; int birth_year; float pay; }; //прототипы функций int fill_record(ifstream &fin, Man* dbase); //заполнение массива структур из файла double poisk_sotrudnika(Man* dbase, int n_record); //вычисление среднего оклада Л. В. Стрикелева Программирование 15

Основы системы ввода-вывода Поиск в массиве структур int fill_record( ifstream &fin, Man* dbase); int Основы системы ввода-вывода Поиск в массиве структур int fill_record( ifstream &fin, Man* dbase); int main() { ifstream fin ("dbase. txt", ios: : in ); if (!fin) {cout << "Error" << endl; _getch(); return 1; } Man dbase [l_dbase]; // dbase – массив структур int n_record = fill_record(fin, dbase); //функция заполнения базы из файла // возвращает количество записей if (n_record==-1) { cout << "Error: L>=l_base" << endl; _getch(); return -1; } //вызов функции вычисления среднего оклада double sred = poisk_sotrudnika(dbase, n_record); if (sred==-2) { cout << "sotrudnika net" << endl; _getch(); return -2; } else if (sred==-3) { cout <<"sotrudnikа net && l>=l_base" << endl; _getch(); return -3; } else cout << "srednij oklad: " << sred << endl; _getch(); return 0; } 16 double poisk_sotrudnika( Man* dbase, int n_record); Л. В. Стрикелева Программирование

Основы системы ввода-вывода Поиск в массиве структур Функция заполнения массива структур из файла int Основы системы ввода-вывода Поиск в массиве структур Функция заполнения массива структур из файла int fill_record(ifstream &fin, Man* dbase) { // dbase – массив структур для хранения всей базы int i =0; char buf[l_buf]; //строка для считывания из файла while(fin. getline(buf, l_buf)&& i=l_dbase) return -1; return i-1; //количество считанных из файла записей } Л. В. Стрикелева Программирование 17

Основы системы ввода-вывода Поиск в массиве структур double poisk_sotrudnika(Man* dbase, int n_record) {char name[l_name+1]; Основы системы ввода-вывода Поиск в массиве структур double poisk_sotrudnika(Man* dbase, int n_record) {char name[l_name+1]; // фамилия сотрудника int n_man=0; //количество сотрудников double mean_pay = 0; //суммируемый оклад while (true) { // цикл поиска сотрудников по фамилии cout << "FIO or end ? " ; cin >>name; if (strcmp (name, "end") ==0) break; if (n_man >= n_record) return -3; //выход при неверных данных bool not_found = true; // переменная-флаг for (int i=0; i0) } Л. В. Стрикелева Программирование return (mean_pay / n_man); Функция вычисления 18 среднего оклада

Основы системы ввода-вывода Сортировка массива структур Исходные данные и результаты: Написать программу, которая сортирует Основы системы ввода-вывода Сортировка массива структур Исходные данные и результаты: Написать программу, которая сортирует файл, созданный в предыдущей программе, по году рождения сотрудников и записывает результаты в новый файл. Для сортировки применим метод выбора (из массива выбирается наименьший элемент и меняется местами с первым элементом, затем рассматриваются элементы, начиная со второго, наименьший из них меняется местами со вторым элементом и т. д. ). Добавим в программу две новые функции: void record_sort (Man* dbase, int n_record); //сортировка массива структур void file_print (ofstream& fout, Man* dbase, int n_record); //вывод в файл отсортированных данных Л. В. Стрикелева Программирование 19

Основы системы ввода-вывода Сортировка массива структур Добавим в конец функции main() следующие операторы: else Основы системы ввода-вывода Сортировка массива структур Добавим в конец функции main() следующие операторы: else cout << "srednij oklad: " << sred << endl; fin. close(); record_sort (dbase, n_record); //вызов функции сортировки массива структур ofstream fout ("dbase 1. txt"); if (!fout) { cout << "Error open" << endl; _getch(); return 2; } file_print(fout, dbase, n_record); //вывод в файл _getch(); return 0; } Л. В. Стрикелева Программирование 20

Основы системы ввода-вывода Сортировка массива структур Функция сортировки void record_sort (Man* dbase, int n_record) Основы системы ввода-вывода Сортировка массива структур Функция сортировки void record_sort (Man* dbase, int n_record) { for (int i=0; i

Основы системы ввода-вывода Сортировка массива структур Функция вывода в файл отсортированных данных void file_print Основы системы ввода-вывода Сортировка массива структур Функция вывода в файл отсортированных данных void file_print (ofstream& fout, Man* dbase, int n_record) { for (int i=0; i

Основы системы ввода-вывода int main() Структуры и бинарные файлы {const int l_name = 30; Основы системы ввода-вывода int main() Структуры и бинарные файлы {const int l_name = 30; struct { char name [l_name+1]; int birth_year; float pay; } man; fstream fin ("dbase. txt", ios: : in ); //текстовый файл if (!fin) {cout << "Error 1" << endl; _getch(); return 1; } fstream fout ("dbase. bin", ios: : binary| ios: : out); //бинарный if (!fout) { cout << "Error 2" << endl; _getch(); return 2; } while (true) { fin >> man. name >> man. birth_year >> man. pay; if (fin. eof()) break; cout. setf(ios: : left); //выводим на экран cout<(&man), sizeof(man)); } cout << "OK"<< endl; _getch(); 23 return 0; } Л. В. Стрикелева Программирование

Основы системы ввода-вывода Исходные данные и результаты: программа по номеру записи корректирует оклад сотрудника Основы системы ввода-вывода Исходные данные и результаты: программа по номеру записи корректирует оклад сотрудника в файле (формат предыдущей задачи). const int l_name = 30; struct Man { char name [l_name+1]; int birth_year; float pay; }; int file_read (fstream& fioun); void zamena (fstream& fioun, int n_record); int main() {fstream fioun ("dbase. bin", ios: : in | ios: : out | ios: : binary); if (!fioun) {cout << "Error" << endl; _getch(); return 1; } int i = file_read(fioun); //вызов функции чтения файла и вывода на экран if(i)return -1; fioun. clear(); //сброс битов ошибок, fioun. seekg(0, ios: : end); //перемещение позиции чтения в конец файла int n_record= fioun. tellg()/sizeof(Man); // количество записей в файле fioun. seekg(0, ios: : beg); zamena (fioun, n_record); //вызов функции замены записей _getch(); return 0; 24 Л. В. Стрикелева } Программирование

Основы системы ввода-вывода Исходные данные и результаты: программа по номеру записи корректирует оклад сотрудника Основы системы ввода-вывода Исходные данные и результаты: программа по номеру записи корректирует оклад сотрудника в файле (формат предыдущей задачи). Функция чтения содержимого файла и вывода на экран int file_read (fstream& fioun) { Man man; while (true) { fioun. read (reinterpret_cast(&man), sizeof(man)); if (fioun. eof())break; //если конец файла cout. setf(ios: : left); //формат вывода на экран cout<

Основы системы ввода-вывода Исходные данные и результаты: программа по номеру записи корректирует оклад сотрудника Основы системы ввода-вывода Исходные данные и результаты: программа по номеру записи корректирует оклад сотрудника в файле (формат предыдущей задачи). void zamena (fstream& fioun, int n_record) Функция { int n; замены записей Man man; while (true) {cout << "input n or -1" << endl; cin >> n; if (n<0 || n> n_record) break; int pos = (n-1) * sizeof(man); //байт с информацией о сотруднике n fioun. seekg(pos); //указатель файла на нужный байт fioun. read (reinterpret_cast(&man), sizeof(man)); cout. setf(ios: : left); //вывод на экран старой записи cout<>man. name >> man. birth_year >> man. pay; cout. setf(ios: : left); // выводим на экран cout<(&man), sizeof(man)); } //end while 26 Л. В. Стрикелева return ; } Программирование

Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы Исходные данные и результаты: Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы Исходные данные и результаты: Программа выводит на экран содержимое рассмотренного бинарного файла, упорядочивая фамилии сотрудников по алфавиту. int compare (const void *man 1, const void* man 2); const int l_name = 30; struct Man{ char name [l_name+1]; int birth_year; float pay; }; int main() {fstream fioun ("dbase. bin", ios: : in | ios: : out | ios: : binary); if (!fioun) { cout << "Error" << endl; _getch(); return 1; } fioun. seekg(0, ios: : end); int n_record= fioun. tellg() / sizeof(Man); Man *man = new Man [n_record]; fioun. clear(); Л. В. Стрикелева fioun. seekg(0, ios: : beg); Программирование 27

Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы fioun. seekg(0, ios: : Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы fioun. seekg(0, ios: : beg); fioun. read (reinterpret_cast (man), sizeof(Man)*n_record); fioun. close(); qsort (man, n_record, sizeof (Man), compare); for (int i=0; i

Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы при сортировке по фамилии: Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы при сортировке по фамилии: int compare (const void* man 1, const void* man 2) { return strcmp ( (reinterpret_cast (man 1))->name, (reinterpret_cast (man 2))->name); } при сортировке по году рождения: int compare (const void* man 1, const void* man 2) {int p; if ( (reinterpret_cast (man 1))->birth_year < (reinterpret_cast (man 2))-> birth_year) p = -1; else if( (reinterpret_cast (man 1))->birth_year == (reinterpret_cast (man 2))-> birth_year) p=0; else p=1; return p; } Л. В. Стрикелева Программирование 29

Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы при сортировке по величине Основы системы ввода-вывода Структуры в динамической памяти и бинарные файлы при сортировке по величине оклада int compare (const void* man 1, const void* man 2) { return (reinterpret_cast (man 1))->pay > (reinterpret_cast (man 2))-> pay ? -1: fabs((reinterpret_cast (man 1))->pay (reinterpret_cast (man 2))-> pay ) < 0. 00001 ? 0 : 1; } Л. В. Стрикелева Программирование 30

На сегодня все. До свидания До следующей встречи На сегодня все. До свидания До следующей встречи