Лабораторная работа №8.
Вариант 9.
Цель работы: Практическое освоение приёмов работы с текстовыми файлами.
Задание. Исправит ошибки в PRNT.cpp. Составить описание обработки (алгоpитм как текст) текстового файла, с выдачей результатов обработки на диск и экpан.
Замена в тексте каждого символа, стоящего после заданного символа, другим заданным символом, причем после каждой замены замененный символ становится искомым, а искомый — заменяющим. Количество замен по всему тексту огpаничено заданным числом.
Первоначальный текст программы PRNT.CPP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
//Afqk PRNT.cpp #include <fstream.h> //ifstream, ofstream const LPG=10, //размер страницы LSTR=80, //максимальная длина строки NLEN=20; //максимальная длина имени файла ifstream PRG; //входной и выходной файлы ofstream LIST; char NAME[NLEN],//имя файла CHR; //рабочий символ int I, LEN, NoExist=0;//рабочие переменные int NextChar; //для обнаружения конца файла void main() { LIST.open("PRN1.cpp"); //открытие выходного файла do //начало цикла входных файлов { cout <<"\n Введите имя файла " ; cin >> NAME; PRG.open(NAME); //открытие входного файла if (PRG) // обработка, если файл существует { while (PRG.get(CHR))//цикл страниц { for (I=1;I<=LPG;I++) { //начало цикла страницы NextChar=PRG.peek(); if (NextChar==EOF) { cout<<"\n Последняя страница - неполная \n"; goto STO; } else do //цикл строки { PRG>>CHR; //чтение и запись символа LIST<<CHR; } while (CHR!='\n');// конец } //конец страницы } STO: cout<<"КОНЕЦ ВЫДАЧИ ОДНОГО ФАЙЛА"; } else NoExist=1; } while (!NoExist); // конец цикла входных файлов LIST.close(); } |
Преобразованный файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <fstream.h> //ifstream, ofstream #include <conio.h> //размер страницы const LPG=10, //максимальная длина строки LSTR=80,//максимальная длина имени файла NLEN=20; ifstream PRG; //входной и выходной файл ofstream LIST;. char NAME[NLEN],//имя файла CHR;//рабочий символ int I,NoExist=0;//рабочие переменные int NextChar; //для обнаружения конца файла void main () { LIST.open("PRN1.cpp"); do { cout << "\n Введите имя файла "; cin >> NAME; PRG.open(NAME); if (PRG) { while (PRG.get(CHR)) { LIST.put(CHR); for (I=1; I<=LPG; I++) { do { NextChar = PRG.peek(); if (NextChar == EOF) { cout << "\n Последняя стpаница - неполная \n"; cout << "КОНЕЦ ВЫДАЧИ ОДНОГО ФАЙЛА"; LIST.close(); return; } else { CHR=PRG.get(); LIST.put(CHR); } } while (CHR != '\n'); } } cout << "КОНЕЦ ВЫДАЧИ ОДНОГО ФАЙЛА"; } else NoExist = 1; } while (!NoExist); LIST.close(); } |
По этому заданию был составлен следующий алгоритм:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
НАЧАЛО Ввести имя файла для обработки в s Ввести искомый символ в c Ввести на что заменять последующий символ cz Ввести количество замен в nz открыть файл s для чтения открыть файл Output.txt для записи Пока не конец файла считать из файла s строку символов Пока не конец строки символов делать если символ строки = искомому, то в ct загнать c в с загнать следующий символ в следующий символ загнать cz в cz загнать ct Вывести строку Записать строку в Output.txt Закрыть файлы КОНЕЦ |
По этому алгоритму была составлена следующая программа на C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include <stdio.h> #include <io.h> #include <alloc.h> #include <fcntl.h> #include <process.h> #include <sys\stat.h> int main(void) { //void *buf; int handle,handle2, bytes,res; const counts=10; //buf = malloc(counts); char buf[counts]=" "; char c,cz,ct; char s[128]; int i,nz; int z=0; c='u'; cz='a'; printf( "Программа начала работу\n"); printf("Введите имя файла для обработки:");scanf("%s",s); fflush(stdin); printf("Введите искомый символ: ");scanf("%c",c); fflush(stdin); printf("Введите на что заменять последующий символ: ");scanf("%c",cz);fflush(stdin); printf("Введите количество замен: ");scanf("%i",&nz); fflush(stdin); if ((handle = open("input.txt", O_RDONLY, S_IWRITE | S_IREAD)) == -1) { printf("Error Opening File\n"); exit(1); } handle2 = creat("Output.txt", S_IREAD |S_IWRITE); while ((bytes = read(handle, buf, counts)) > 0) { printf("Text: %s \n",buf); for (i=0; (i<=counts)&&(i<=bytes); i++) { if ((buf[i]==c)&&(z!=nz)) { i++; z++; ct=c; c=buf[i]; buf[i]=cz; cz=ct; } } printf("out: %s",buf); write(handle2, buf, bytes); for (i=0; i<counts; i++) buf[i]=' '; } close(handle); close(handle2); return 0; } |
Структура данных:
handle, handle2 — файлы
bytes для количества прочитанных байтов
res результат записи
buf буфер
c – символ для поиска,cz – символ для замены ,ct – символ для временного хранения
s – имя файла для обработки
i — счётчик циклов
nz – количество замен
я – счётчик замен