Advertisement
Dimique

Untitled

Dec 14th, 2018
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.09 KB | None | 0 0
  1. //Тема: ОБРАБОТКА С-СТРОК + ФАЙЛЫ (ПОТОКИ)
  2. #include "stdafx.h"
  3. #include <iostream>
  4. #include <cstring>
  5.  
  6.  
  7. #define FNAME_I "E:\\st_i.txt\0" //имя исх. файла задано константной строкой
  8. #define FNAME_R "E:\\st_r.txt\0" //имя рез. файла задано константной строкой
  9. const int SIZE = 80; //максимальная длина строки
  10. const char PR_R[] = "r"; //признак открытия файла на чтение
  11. const char PR_W[] = "w"; //признак открытия файла на запись
  12. void make_file(char *fname); //функция создания файла
  13. int check_file(char *fname, const char *); //проверка наличия файла
  14. void edit_file(char *, char *); //обработка содержимого
  15. void print_file(char*); //вывод содержимого файла на печать
  16. using namespace std;
  17. //main_Begin______________________________________________________________
  18. int main()
  19. {  
  20.     setlocale(0, "");  
  21.     char fname_i[20] = FNAME_I;
  22.     char fname_r[20] = FNAME_R;  
  23.     //создаем исходный файл  
  24.     make_file(fname_i);  //выводим его содержимое  
  25.     if (!check_file(fname_i, PR_R))  
  26.     {  
  27.         cout << "Ошибка открытия файла " << fname_i << " на чтение" << endl;  
  28.         cout << "Нажмите <Enter>" << endl;  
  29.         getchar();   return 1; //если исходный файл не создан  
  30.     }  
  31.     cout << "Содержимое исходного файла:" << endl;  
  32.     print_file(fname_i);  //обрабатываем файл  
  33.     edit_file(fname_i, fname_r);  //выводим содержимое результата  
  34.     if (!check_file(fname_r, PR_R))  
  35.     {  
  36.         cout << "Ошибка открытия файла " << fname_r << " на чтение" << endl;  
  37.         cout << "Нажмите <Enter>" << endl;  
  38.         getchar();   return 1; //если результирующий файл не создан  
  39.     }  
  40.     cout << "Результат (в каждой строке удалены слова с повторяющимися буквами):\n";  
  41.     print_file(fname_r);  
  42.     cout << endl << "Для завершения нажмите <Enter>";  
  43.     getchar();  
  44.     return 0;
  45. }
  46.  
  47. //main_End________________________________________________________________
  48. //make_file_ Begin________________________________________________________
  49. void make_file(char *fname_i)
  50. {  
  51.     char st[SIZE]; //исходная строка  
  52.     FILE *in; //текстовый файл  
  53.     char input; //ответ пользователя    
  54.                 //Открываем файл в режиме чтения (r)    
  55.                 //Если файл с таким именем уже есть, то либо пользователь вводит    
  56.                 //новое имя, либо новые записи будут дописаны поверх старых  
  57.  
  58.  
  59. while (check_file(fname_i, PR_R))
  60.     {
  61.         cout << "Такой файл уже есть! Зададите новое имя Y/N?" << endl;  
  62.         cin.get(input);  
  63.         if (input == 'Y' || input == 'y')
  64.         {
  65.             cout << "Введите новое имя:" << endl;    
  66.             cin >> fname_i;    
  67.             cin.get(); //убираем символ '\n' из потока  
  68.         }  
  69.         else  
  70.         {    
  71.             cin.get(); //убираем символ '\n' из потока    
  72.             break;  
  73.         }  
  74.     }  
  75.     //проверяем возможность открытия файла для записи  
  76.     //поскольку полное имя файла могло быть задано с ошибкой  
  77.     if (!check_file(fname_i, PR_W))  
  78.     {  
  79.         cout << "Ошибка открытия файла " << fname_i << " на запись" << endl;  
  80.         cout << "Нажмите <Enter>" << endl;  
  81.         getchar();  
  82.         exit(1);  
  83.     }  
  84.     //Открываем файл в режиме записи (w) текста (по умолчанию)  
  85.     //Если файл с таким именем уже есть, то новые данные  
  86.     //будут дописаны поверх старых  
  87.     in = fopen(fname_i, PR_W);  cout << "Создание файла." << endl;  
  88.     cout << "Признак окончания ввода - ввод пустой строки" << endl;  
  89.     cout << "Введите строку и нажмите <Enter>" << endl;  
  90.     cout << "->";  
  91.     cin.getline(st, SIZE); //функция вводит строку целиком, включая          
  92.                            //пробелы и символ \n  
  93.     while (strlen(st))  
  94.     {  
  95.         fprintf(in, "%s\n", st);  
  96.         cout << "Введите строку и нажмите <Enter>" << endl;  
  97.         cout << "->";  
  98.         input++;  
  99.         cin.getline(st, SIZE);  
  100.     }  
  101.     fclose(in); //закрываем файл
  102. }
  103. //make_file_End___________________________________________________________
  104. //check_file_Begin_____________________________________________________
  105. //проверка наличия файла
  106. int check_file(char *fname, const char *pr)
  107. {  
  108.     //Открываем файл  
  109.     if ((fopen(fname, pr)) == NULL) //файл не существует  
  110.         return 0;  
  111.     return 1;
  112. }
  113. //check_file_End_______________________________________________________
  114. //edit_file_Begin____________________________________________________
  115. //обработка содержимого файла
  116. void edit_file(char *fname_i, char *fname_r)
  117. {  
  118.     FILE *in, *out; //исходный и результирующий файлы (потоки)  
  119.     char st[SIZE]; //исходная строка  
  120.     char sr[SIZE]; //результирующая строка  
  121.     char pr[SIZE]; //обрабатываемое слово  
  122.     int i, j, l, d, k; //номер обрабатываемого символа  
  123.     int flag; //признак четного номера слова  
  124.     int n; //длина результирующей строки  
  125.     in = fopen(fname_i, PR_R); //открываем файл на чтение
  126.     out = fopen(fname_r, PR_W); //открываем файл на запись  
  127.     fgets(st, SIZE, in); //читаем строку из файла
  128.     while (!feof(in))  
  129.     {  
  130.         i = 0;  
  131.         n = 0;      
  132.         flag = 1;  
  133.         sr[i] = '\0';  
  134.         while (st[i])  
  135.         {    
  136.             k = 0;    
  137.             while (st[i] == ' ') //удаляем в строке ведущие пробелы    
  138.                 i++;    
  139.             while (st[i] != ' ' && st[i + 1]) //выделяем очередное слово    
  140.             {    
  141.                 pr[k] = st[i];    
  142.                 k++;    
  143.                 i++;
  144.             }            
  145.             for (l = 0; l < k - 1; l++) {
  146.                 for (d = l + 1; d < k; d++) {
  147.                     int number1 = (int)pr[l];      
  148.                     int number2 = (int)pr[d];                  
  149.                     if (number1 == number2)        
  150.                         flag = 0;
  151.                 }
  152.             }                  
  153.             if (flag == 1) //если символы в слове повторяются    
  154.             {    
  155.                 for (j = 0; j < k; j++, n++)      
  156.                     sr[n] = pr[j];    
  157.                 if (st[i])      sr[n] = ' ';    
  158.                 n++;    
  159.                 flag = 1;    
  160.             }    
  161.             else    
  162.                 flag = 1;    
  163.             i++;  
  164.         }   sr[n++] = '\0'; //закрываем результирующую строку  
  165.         fprintf(out, "%s\n", sr); //записываем обработанную строку в новый файл  
  166.         fgets(st, SIZE, in); //считываем новую строку из файла  
  167.     }
  168.     system("pause");  fclose(in); fclose(out); //Закрываем файлы in и out
  169. }
  170.  
  171.      //edit_file_End______________________________________________________
  172.      //print_file_Begin________________________________________________________
  173.      //вывод содержимого файла на экран
  174.  
  175.  
  176.             void print_file(char *fname) {
  177.             FILE *in_out;  char st[SIZE]; //считанная строка  
  178.             in_out = fopen(fname, PR_R); //открываем файл на чтение  
  179.             fgets(st, SIZE, in_out); //читаем строку из файла in_out  
  180.             while (!feof(in_out))  
  181.             {  
  182.                 cout << st; //выводим очередную строку на экран  
  183.                 fgets(st, SIZE, in_out);  
  184.             }  
  185.             fclose(in_out);
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement