4 12ЛР инфа
.docxЛабораторная работа №12
Строки и текстовые файлы
Цель лабораторной работы: изучение структурной организации, способов доступа к элементам и других особенностей текстовых файлов; изучение стандартных средств языка C/C++ для работы со строками и текстовыми файлами; совершенствование навыков процедурного программирования на языке C/C++ при решении задач редактирования текстовых файлов.
Задание на программирование: используя технологию процедурного программирования разработать программу обработки текстовых файлов с числом строк не менее пяти, каждая из которых содержит не более 80 символов, в соответствии с индивидуальным заданием.
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание на обработку строк текстового файла.
2) Построить схему алгоритма решения задачи с использованием функций обработки строки, функции создания, просмотра и редактирования текстового файла.
3) Составить спецификации функций.
4) Составить программу на языке C/C++.
5) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов. Обеспечить одновременный показ на экране исходного и отредактированного файлов.
8) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, спецификации функций, текст программы, контрольные примеры.
Формулировка задания:
(Вариант №21)
Дан текст. Словом текста считается любая последовательность букв алфавита; между соседними словами - не менее одного пробела. Перед первым и за последним словом каждой строки произвольное число пробелов. Перенести последнюю букву каждого слова в его начало.
Текст программы
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>
#define FNAME_I "D:\\st_i.txt\0"
#define FNAME_R "D:\\st_r.txt\0"
const int RAZ = 80;
const char PR_R[] = "r";
const char PR_W[] = "w";
void make_file(char *fname);
int proverka_file(char *fname, const char *);
void obrabotka_file(char *, char *);
void vivod_file(char*);
using namespace std;
int main()
{setlocale(LC_ALL,"Russian") ;
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char fname_i[20] = FNAME_I;
char fname_r[20] = FNAME_R;
make_file(fname_i);
if (!proverka_file(fname_i, PR_R))
{
cout << "Ошибка открытия файла " << fname_i << " на чтение" << endl;
cout << "Нажмите <Enter>" << endl;
getchar();
return 0;
}
cout << "Содержимое исходного файла:" << endl;
vivod_file(fname_i);
obrabotka_file(fname_i, fname_r);
if (!proverka_file(fname_r, PR_R))
{
cout << "Ошибка открытия файла " << fname_r << " на чтение" << endl;
cout << "Нажмите <Enter>" << endl;
getchar();
return 0;
}
cout << "Результат :\n";
vivod_file(fname_r);
cout << endl << "Для завершения нажмите <Enter>";
getchar();
return 0;
}
void make_file(char *fname_i)
{
char st[RAZ];
FILE *in;
char otv;
while (proverka_file(fname_i, PR_R))
{
cout << "Такой файл уже есть! Зададите новое имя Y/N?" << endl;
cin.get(otv);
if (otv == 'Y' || otv == 'y')
{
cout << "Введите новое имя:" << endl;
cin >> fname_i;
cin.get();
}
else {
cin.get();
break;
}
}
if (!proverka_file(fname_i, PR_W))
{
cout << "Ошибка открытия файла " << fname_i << " на запись" << endl;
cout << "Нажмите <Enter>" << endl;
getchar();
exit(0);
}
in = fopen(fname_i, PR_W);
cout << "Создание файла." << endl;
cout << "Признак окончания ввода - ввод пустой строки" << endl;
cout << "Введите строку и нажмите <Enter>" << endl;
cout << "->";
cin.getline(st, RAZ);
while (strlen(st))
{
fprintf(in, "%s\n", st);
cout << "Введите строку и нажмите <Enter>" << endl;
cout << "->";
otv++;
cin.getline(st, RAZ);
}
fclose(in);
}
int proverka_file(char *fname, const char *pr)
{
if ((fopen(fname, pr)) == NULL)
return(0);
return(1);
}
void obrabotka_file(char *fname_i, char *fname_r) {
FILE *in, *out;
char buffer[2];
std::string str = " ";
std::string words;
in = fopen(fname_i, PR_R) ;
out = fopen(fname_r, PR_W) ;
while (!feof(in))
{
if (fgets(buffer, 2, in) == NULL) break;
if (buffer[0] == ' ' || buffer[0] == '\n') {
str[0] = str[str.length() - 1];
str[str.length() - 1] = buffer[0];
fprintf(out, str.c_str());
str.clear();
str = " ";
}
else {
str.append(buffer);
}
}
fclose(in);
fclose(out);
}
void vivod_file(char *fname)
{
FILE *in_out;
char st[RAZ];
in_out = fopen(fname, PR_R);
fgets(st, RAZ, in_out);
while (!feof(in_out))
{
cout << st;
fgets(st, RAZ, in_out);
}
fclose(in_out);
}
Скриншот контрольного примера выполнения программы