Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Тема: ОБРАБОТКА С-СТРОК + ФАЙЛЫ (ПОТОКИ)
- #include "stdafx.h"
- #include <iostream>
- #include <cstring>
- #define FNAME_I "E:\\st_i.txt\0" //имя исх. файла задано константной строкой
- #define FNAME_R "E:\\st_r.txt\0" //имя рез. файла задано константной строкой
- const int SIZE = 80; //максимальная длина строки
- const char PR_R[] = "r"; //признак открытия файла на чтение
- const char PR_W[] = "w"; //признак открытия файла на запись
- void make_file(char *fname); //функция создания файла
- int check_file(char *fname, const char *); //проверка наличия файла
- void edit_file(char *, char *); //обработка содержимого
- void print_file(char*); //вывод содержимого файла на печать
- using namespace std;
- //main_Begin______________________________________________________________
- int main()
- {
- setlocale(0, "");
- char fname_i[20] = FNAME_I;
- char fname_r[20] = FNAME_R;
- //создаем исходный файл
- make_file(fname_i); //выводим его содержимое
- if (!check_file(fname_i, PR_R))
- {
- cout << "Ошибка открытия файла " << fname_i << " на чтение" << endl;
- cout << "Нажмите <Enter>" << endl;
- getchar(); return 1; //если исходный файл не создан
- }
- cout << "Содержимое исходного файла:" << endl;
- print_file(fname_i); //обрабатываем файл
- edit_file(fname_i, fname_r); //выводим содержимое результата
- if (!check_file(fname_r, PR_R))
- {
- cout << "Ошибка открытия файла " << fname_r << " на чтение" << endl;
- cout << "Нажмите <Enter>" << endl;
- getchar(); return 1; //если результирующий файл не создан
- }
- cout << "Результат (в каждой строке удалены слова с повторяющимися буквами):\n";
- print_file(fname_r);
- cout << endl << "Для завершения нажмите <Enter>";
- getchar();
- return 0;
- }
- //main_End________________________________________________________________
- //make_file_ Begin________________________________________________________
- void make_file(char *fname_i)
- {
- char st[SIZE]; //исходная строка
- FILE *in; //текстовый файл
- char input; //ответ пользователя
- //Открываем файл в режиме чтения (r)
- //Если файл с таким именем уже есть, то либо пользователь вводит
- //новое имя, либо новые записи будут дописаны поверх старых
- while (check_file(fname_i, PR_R))
- {
- cout << "Такой файл уже есть! Зададите новое имя Y/N?" << endl;
- cin.get(input);
- if (input == 'Y' || input == 'y')
- {
- cout << "Введите новое имя:" << endl;
- cin >> fname_i;
- cin.get(); //убираем символ '\n' из потока
- }
- else
- {
- cin.get(); //убираем символ '\n' из потока
- break;
- }
- }
- //проверяем возможность открытия файла для записи
- //поскольку полное имя файла могло быть задано с ошибкой
- if (!check_file(fname_i, PR_W))
- {
- cout << "Ошибка открытия файла " << fname_i << " на запись" << endl;
- cout << "Нажмите <Enter>" << endl;
- getchar();
- exit(1);
- }
- //Открываем файл в режиме записи (w) текста (по умолчанию)
- //Если файл с таким именем уже есть, то новые данные
- //будут дописаны поверх старых
- in = fopen(fname_i, PR_W); cout << "Создание файла." << endl;
- cout << "Признак окончания ввода - ввод пустой строки" << endl;
- cout << "Введите строку и нажмите <Enter>" << endl;
- cout << "->";
- cin.getline(st, SIZE); //функция вводит строку целиком, включая
- //пробелы и символ \n
- while (strlen(st))
- {
- fprintf(in, "%s\n", st);
- cout << "Введите строку и нажмите <Enter>" << endl;
- cout << "->";
- input++;
- cin.getline(st, SIZE);
- }
- fclose(in); //закрываем файл
- }
- //make_file_End___________________________________________________________
- //check_file_Begin_____________________________________________________
- //проверка наличия файла
- int check_file(char *fname, const char *pr)
- {
- //Открываем файл
- if ((fopen(fname, pr)) == NULL) //файл не существует
- return 0;
- return 1;
- }
- //check_file_End_______________________________________________________
- //edit_file_Begin____________________________________________________
- //обработка содержимого файла
- void edit_file(char *fname_i, char *fname_r)
- {
- FILE *in, *out; //исходный и результирующий файлы (потоки)
- char st[SIZE]; //исходная строка
- char sr[SIZE]; //результирующая строка
- char pr[SIZE]; //обрабатываемое слово
- int i, j, l, d, k; //номер обрабатываемого символа
- int flag; //признак четного номера слова
- int n; //длина результирующей строки
- in = fopen(fname_i, PR_R); //открываем файл на чтение
- out = fopen(fname_r, PR_W); //открываем файл на запись
- fgets(st, SIZE, in); //читаем строку из файла
- while (!feof(in))
- {
- i = 0;
- n = 0;
- flag = 1;
- sr[i] = '\0';
- while (st[i])
- {
- k = 0;
- while (st[i] == ' ') //удаляем в строке ведущие пробелы
- i++;
- while (st[i] != ' ' && st[i + 1]) //выделяем очередное слово
- {
- pr[k] = st[i];
- k++;
- i++;
- }
- for (l = 0; l < k - 1; l++) {
- for (d = l + 1; d < k; d++) {
- int number1 = (int)pr[l];
- int number2 = (int)pr[d];
- if (number1 == number2)
- flag = 0;
- }
- }
- if (flag == 1) //если символы в слове повторяются
- {
- for (j = 0; j < k; j++, n++)
- sr[n] = pr[j];
- if (st[i]) sr[n] = ' ';
- n++;
- flag = 1;
- }
- else
- flag = 1;
- i++;
- } sr[n++] = '\0'; //закрываем результирующую строку
- fprintf(out, "%s\n", sr); //записываем обработанную строку в новый файл
- fgets(st, SIZE, in); //считываем новую строку из файла
- }
- system("pause"); fclose(in); fclose(out); //Закрываем файлы in и out
- }
- //edit_file_End______________________________________________________
- //print_file_Begin________________________________________________________
- //вывод содержимого файла на экран
- void print_file(char *fname) {
- FILE *in_out; char st[SIZE]; //считанная строка
- in_out = fopen(fname, PR_R); //открываем файл на чтение
- fgets(st, SIZE, in_out); //читаем строку из файла in_out
- while (!feof(in_out))
- {
- cout << st; //выводим очередную строку на экран
- fgets(st, SIZE, in_out);
- }
- fclose(in_out);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement