вв_выв_примеры.ppt
- Количество слайдов: 31
Стрикелева Л. В. Программирование Основы системы ввода-вывода. Файлы (примеры)
Основы системы ввода-вывода 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 <<"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 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 (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. Добавим в программу определение и вызов функции 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. Добавим в функцию 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. Добавим в функцию 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: Подсчет количества повторений слова в текстовом файле 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, 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 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 fill_record(ifstream &fin, Man* dbase) { // dbase – массив структур для хранения всей базы int i =0; char buf[l_buf]; //строка для считывания из файла while(fin. getline(buf, l_buf)&& i