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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
| #define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<clocale>
using namespace std;
#define FNAME_I "D:\\st_i.txt\0"//имя исх. файла задано константной строкой
#define FNAME_R "D:\\st_r.txt\0"//имя рез. файла задано константной строкой
const int RAZ = 81; //максимальная длина строки
const char PR_R[] = "r"; //признак открытия файла на чтение
const char PR_W[] = "w"; //признак открытия файла на запись
void make_file(char *); //функция создания файла
int proverka_file(char *, const char *); //функция проверки наличия файла
void obrabotka_file(char *, char *); //функция обработки содержимого
void vivod_file(char *); //вывод содержимого файла на печат
//main_Begin______________________________________________________________
int main()
{
char fname_i[] = FNAME_I;
char fname_r[] = FNAME_R;
setlocale(LC_ALL, "Russian");
cout << " Программа создает файл строк." << endl;
cout << " Затем файл построчно читается, при этом в каждой строке " << endl;
cout << " во всех словах, разделенными произвольным количеством " << endl;
cout << " пробелов, удаляются последующие вхождения первой буквы. " << endl;
cout << " Создаем исходный файл: " << endl;
//создаем исходный файл
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 << " Во всех словах в каждой строке удалены " << endl;
cout << " последующие вхождения первой буквы. " << endl;
vivod_file(fname_r);
cout << endl << " Для завершения нажмите <Enter>";
getchar();
return 0;
}
//main_End________________________________________________________________
//make_file_ Begin________________________________________________________
//функция создания файла
void make_file(char* fname_i)
{
char st[RAZ]; //исходная строка
FILE *in; //текстовый файл
char otv; //ответ пользователя
/*Открываем файл в режиме чтения (r)
Если файл с таким именем уже есть, то либо пользователь вводит
новое имя, либо новые записи будут записаны поверх старых*/
while (proverka_file(fname_i, PR_R))
{
cout << " Файл с заданным именем уже есть! Зададите новое имя Y/N? ";
cin.get(otv);
if (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')
{
cout << " Введите новое имя:" << endl;
cin >> fname_i;
cin.get(); //убираем символ '\n' из потока
}
else {
cin.get(); //убираем символ '\n' из потока
break;
}
}
/*проверяем возможность открытия файла для записи
поскольку полное имя файла могло быть задано с ошибкой*/
if (!proverka_file(fname_i, PR_W))
{
cout << " Ошибка открытия файла " << fname_i << " на запись " << endl;
cout << " Нажмите <Enter> " << endl;
getchar();
exit(0);
}
/*Открываем файл в режиме записи (w) текста (по умолчанию).
Если файл с таким именем уже есть, то новые данные
будут записаны поверх старых*/
in = fopen(fname_i, PR_W);
cout << " Создание файла." << endl;
cout << " Признак окончания ввода - ввод пустой строки. " << endl;
cout << " Введите строку и нажмите <Enter> " << endl;
cout << " --> ";
cin.getline(st, RAZ); /* функция вводит строку целиком, включая
пробелы и символ \n */
while (strlen(st))
{
fprintf(in, "%s\n", st);
cout << " Введите строку и нажмите <Enter> " << endl;
cout << " --> ";
cin.getline(st, RAZ);
}
fclose(in); //закрываем файл
}
//make_file_End___________________________________________________________
//proverka_file_Begin_____________________________________________________
//функция проверки наличия файла
int proverka_file(char *fname, const char *pr)
{
//Открываем файл
if ((fopen(fname, pr)) == NULL) //если файл не существует
return(0);
return(1);
}
//proverka_file_End_______________________________________________________
//obrabotka_file_Begin____________________________________________________
//функция обработки содержимого файла
void obrabotka_file(char *fname_i, char *fname_r)
{
FILE *in, *out; //исходный и результирующий файлы (потоки)
char st_source[RAZ]; //обрабатываемая строка
char st_result[RAZ]; //результирующая строка
char *p = new char(RAZ); //указатель на выделенное слово
in = fopen(fname_i, PR_R); //открываем файл на чтение
out = fopen(fname_r, PR_W); //открываем файл на запись
fgets(st_source, RAZ, in); //читаем первую строку из файла in
while (!feof(in)) //пока не найден признак конца файла
{
st_result[0] = '\0'; //очищаем результирующую строку
p = strtok(st_source, " \n"); //выделяем первое слово (лексему) в исходной строке
while (p) //Пока очередное слово выделено
{//обрабатываем слово
for (int i = 0; i < strlen(p); i++) //проход по каждой букве слова
{
if (p[i] == p[0]) //если первая буква совпадает со следующими
{
p[i] = 'X'; //буквами в слове, то эти буквы заменяются на X
strcat(st_result, p); //добавляем слово к результату
strcat(st_result, " "); //добавляем пробел между слов
}
}
p = strtok(NULL, " \n"); //выделение последующих слов
}//while(p)
st_result[strlen(st_result) - 1] = '\0'; //убираем последний пробел
if (strlen(st_result)) //если строка не пустая
fprintf(out, "%s\n", st_result); //записываем строку в новый файл
fgets(st_source, RAZ, in); //считываем новую строку из файла
}//while(!feof(in))
fclose(in); //Закрываем файл in
fclose(out); //Закрываем файл out
}
//obrabotka_file_End______________________________________________________
//vivod_file_Begin________________________________________________________
//функция вывода содержимого файла на экран
void vivod_file(char *fname)
{
FILE *in_out;
char st[RAZ]; //считанная строка
in_out = fopen(fname, PR_R); //открываем файл на чтение
fgets(st, RAZ, in_out); //читаем строку из файла in_out
while (!feof(in_out)) //пока не найден признак конца файла
{
cout << st; //выводим очередную строку на экран
fgets(st, RAZ, in_out); //читаем строку из файла in_out
}
fclose(in_out); //закрываем файл
}
//vivod_file_End__________________________________________________________ |