Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поменять местами слова в файле

88K
30 декабря 2013 года
Raton_Laveur
3 / / 30.12.2013
В исходном текстовом файле (создать и ввести) первое слово поменять местами со вторым. Дополнительных массивов и файлов не использовать.
С файлами понятно. Загрузилась на словах про дополнительные массивы: то есть если даже в строку из файла не считывать, то как это сделать, в самом файле?? Предполагаю, что позиции как-то менять надо, но вот с этим проблема...
  • А не прокатит прочитать в буфер первое слово, а потом дописать в его начало второе?.. Ну а потом записать это в файл... от transParent, 30 декабря 2013 года
326
30 декабря 2013 года
sadovoya
757 / / 19.11.2005
Хранились бы слова в массиве, а не в файле, можно было б задействовать арифметику указателей и их разыменовывание, например. А для файла аналог указателя - итератор. Дальше сами.
88K
31 декабря 2013 года
Raton_Laveur
3 / / 30.12.2013
"А не прокатит прочитать в буфер первое слово, а потом дописать в его начало второе?.. Ну а потом записать это в файл... от transParent, вчера, 23:07" -
я, конечно, понимаю, что всё гениальное просто, но буфер - это же массив будет, я так понимаю?)
11K
05 января 2014 года
xAtom
65 / / 17.01.2011
Код:
#include <stdio.h>



// только для ASCII-слов
int main(void){
   FILE* fp = fopen("word2.txt", "rt+");
   if(fp == NULL)
         return 1;
   int  a, b;
   long pa, pb, la, lb;

   //позиция 1-ого слова
   fscanf(fp, "%*[^a-zA-Z]");
   pa = ftell(fp);
   fscanf(fp, "%*[a-zA-Z]");
   la = ftell(fp) - pa;

   // позиция 2-ого слова
   fscanf(fp, "%*[^a-zA-Z]");
   pb = ftell(fp);
   fscanf(fp, "%*[a-zA-Z]");
   lb = ftell(fp) - pb;

   // посимвольная перезапись(обмен)
   for(long i = (la < lb) ? la : lb; i > 0L; --i){
        fseek(fp, pa, SEEK_SET);
        a = fgetc(fp);

        fseek(fp, pb, SEEK_SET);
        b = fgetc(fp);
        fseek(fp, -1L, SEEK_CUR);
        fputc(a, fp);
        pb = ftell(fp);

        fseek(fp, pa, SEEK_SET);
        fputc(b, fp);
        pa = ftell(fp);
   }

   //если 2-ое слово больше 1-oго
   long ia, ib;
   if(lb > la) {
        --pa;
        for(long i = lb - la; i > 0L; --i, ++pa, ++pb) {
             ib = pb;
             fseek(fp, pb - 1, SEEK_SET);
             while(pa < ib) {
                  a = fgetc(fp);
                  b = fgetc(fp);
                  fseek(fp, -2L, SEEK_CUR);
                  fputc(b, fp);
                  fputc(a, fp);
                  fseek(fp, -3L, SEEK_CUR);
                  ib = ftell(fp);
             }
       }

   } else if(la > lb) { // если 1-ое слово больше 2-oго

        for(long i = la - lb; i > 0L; --i) {
             ia = pa;
             fseek(fp, pa, SEEK_SET);
             while(ia < pb - 1) {
                 a = fgetc(fp);
                 b = fgetc(fp);
                 fseek(fp, -2L, SEEK_CUR);
                 fputc(b, fp);
                 fputc(a, fp);
                 fseek(fp, -1L, SEEK_CUR);
                 ia = ftell(fp);
            }
       }
   }

   fclose(fp);
   return 0;
}
Например в файле содержатся два слова:
APL+++[]+++AppleTalk
88K
06 января 2014 года
Raton_Laveur
3 / / 30.12.2013
Цитата: xAtom

Например в файле содержатся два слова:
APL+++[]+++AppleTalk


ого. нет сейчас времени проверять на рабочесть, но выглядит логично. спасибо.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог