В исходном текстовом файле первое слово поменять местами со вторым - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ребята, нужна помощь. Только начал изучать, помогите. как в си реализовать такую задачу. В исходном текстовом файле (создать и ввести) первое слово поменять местами со вторым. Дополнительных массивов и файлов не использовать.
Листинг программы
  1. file *fail;
  2. fail=fopen("test.txt", "w"); //открыли
  3. if(fail == NULL) //проверили на доступ к файлу
  4. {
  5. printf("ERROR");
  6. exit(0);
  7. }
  8. fprintf(fail, "Hello world"); //записали
  9. //вот как тут не создавая массивов и файлов поменять местами слова.
  10. fclose(fail);
Заранее благодарен за ответ.

Решение задачи: «В исходном текстовом файле первое слово поменять местами со вторым»

textual
Листинг программы
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4. // только для ASCII-слов
  5. int main(void)
  6. {
  7.     FILE* fp = fopen("test.txt", "w+t"); //создаем указатель на файл и тут же отрываем его функццией fopen (char *filename, char *mode); w+t - открытие для чтения и записи в текстовом режиме, если файл существует, то его содержимое теряется.
  8.     if(fp == NULL) //проверили на доступ к файлу
  9.     {
  10.         printf("ERROR"); // сообщение об ошибке
  11.         return 0; // конец программы
  12.     }
  13.     fprintf(fp, "Hello world"); //записали
  14.     fclose(fp); // закрыли редактирование файла
  15.     fp = fopen("test.txt", "rt+"); //редактируем rt+ - открыть файл для чтения и записи, файл должен существовать.
  16.     if(fp == NULL) //проверили на доступ к файлу
  17.     {
  18.         printf("ERROR");// сообщение об ошибке
  19.         return 0; // конец программы
  20.     }
  21.     int  a, b;              // объявление
  22.     long pa, pb, la, lb;    // переменных
  23.  
  24.     //позиция 1-ого слова
  25.     fscanf(fp, "%*[^a-zA-Z]");
  26.     pa = ftell(fp); // Возвращает значение указателя на текущую позицию файла. В случае ошибки возвращает число (-1).
  27.     fscanf(fp, "%*[a-zA-Z]");
  28.     la = ftell(fp) - pa;
  29.  
  30.     // позиция 2-ого слова
  31.     fscanf(fp, "%*[^a-zA-Z]");
  32.     pb = ftell(fp); // Возвращает значение указателя на текущую позицию файла. В случае ошибки возвращает число (-1).
  33.     fscanf(fp, "%*[a-zA-Z]");
  34.     lb = ftell(fp) - pb;
  35.  
  36.     // посимвольная перезапись(обмен)
  37.     for(long i = (la < lb) ? la : lb; i > 0L; --i){
  38.         fseek(fp, pa, SEEK_SET); // установка указателя на некоторую заданную позицию в файле функцией fseek().
  39.         a = fgetc(fp);
  40.  
  41.         fseek(fp, pb, SEEK_SET);
  42.         b = fgetc(fp);
  43.         fseek(fp, -1L, SEEK_CUR);
  44.         fputc(a, fp); // Функция fputc() записывает символ ch в текущую позицию потока stream, a затем увеличивает указатель текущей позиции файла
  45.         pb = ftell(fp);
  46.  
  47.         fseek(fp, pa, SEEK_SET);
  48.         fputc(b, fp);
  49.         pa = ftell(fp);
  50.     }
  51.  
  52.     //если 2-ое слово больше 1-oго
  53.     long ia, ib;
  54.     if(lb > la) {
  55.         --pa;
  56.         for(long i = lb - la; i > 0L; --i, ++pa, ++pb) {
  57.              ib = pb;
  58.              fseek(fp, pb - 1, SEEK_SET);
  59.              while(pa < ib) {
  60.                   a = fgetc(fp);
  61.                   b = fgetc(fp);
  62.                   fseek(fp, -2L, SEEK_CUR);
  63.                   fputc(b, fp);
  64.                   fputc(a, fp);
  65.                   fseek(fp, -3L, SEEK_CUR);
  66.                   ib = ftell(fp);
  67.              }
  68.        }
  69.  
  70.     } else if(la > lb) { // если 1-ое слово больше 2-oго
  71.  
  72.         for(long i = la - lb; i > 0L; --i) {
  73.              ia = pa;
  74.              fseek(fp, pa, SEEK_SET);
  75.              while(ia < pb - 1) {
  76.                  a = fgetc(fp);
  77.                  b = fgetc(fp);
  78.                  fseek(fp, -2L, SEEK_CUR);
  79.                  fputc(b, fp);
  80.                  fputc(a, fp);
  81.                  fseek(fp, -1L, SEEK_CUR);
  82.                  ia = ftell(fp);
  83.             }
  84.        }
  85.     }
  86.  
  87.     fclose(fp);
  88.     return 0;
  89. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы