Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [C++] Обратный порядок слов в документе.  (Прочитано 10997 раз)
0 Пользователей и 1 Гость смотрят эту тему.
сергей2011
Интересующийся

by
Offline Offline

« : 07-02-2012 19:50 » 

помогите советом, голову сломал уже(являюсь новичком):
задача такова: есть документ, необходимо прочитать и перевернуть строки обратным порядком, т.е.
мама мыла раму = раму мыла мама
и т.д. все строки.
есть мои наработки первую строку все красиво делает, вторую...косяк на косяке...не знаю что и делать....

* a_3.txt (1 Кб - загружено 749 раз.)
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-02-2012 20:37 » 

В помощь модераторам и ТС.
Код: (C++)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
void main() { int i=0;
        int p=0;
        int r=0;
        int o=0;
        int d=0;
        FILE *f, *u;
        f = fopen("c:\\1input.txt", "r");
        u = fopen("c:\\output.txt", "w");
        if (f==0 || u==0) {
                cout<<"cannot open file"<<endl;
                return;
        } else
                cout<<"reading..."<<endl;
        cout<<f<<endl;
        char line[100], invLine[100];
        while ( !feof(f)){
                fgets(line, 100, f);
                int len = strlen(line);
                cout<<"lenght= "<<len<<endl;
                //if ((line[len]=='\0'||line[len]=='\n')||(line[len]!='\0'||line[len]!='\n'))
                line[len]='\0';invLine[len]='\0';
                len--;
                r=len;
                //cout<<"lenght= "<<len<<endl;
                for(int k =len; k>-1; k--){
                        if((line[k]==' '&&(line[k]!='\0'||line[k]!='\n')))//||(line[k]!=' '&&(line[k]!='\0'||line[k]!='\n'))) {
                                p=r-i;
                                for(d=k; d<p+1;d++)     {
                                        invLine[i] = line[d];
                                        cout<<"symbol = "<<line[d]<<endl;
                                        i++;
                                }
                        }
                }
                fputs(invLine, u);
                cout<<u<<endl;
                o++;
                line=NULL;
                cout<<"next line"<<endl;
        }
        fclose(f);
        fclose(u);
}

Расскажи словами что и как ты делаешь?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
сергей2011
Интересующийся

by
Offline Offline

« Ответ #2 : 07-02-2012 20:53 » 

в общем так: читаю строку, ее размер, далее читаю справо налево до тех пор, пока не встречу пробел, как только его встретил, его копирую в новую строку в начало, следующий шаг двигаюсь вправо и копирую символ опять в новую строку и т.д.(в итоге копируется последнее слово в новую строку на первую позицию) до тех пор пока не конец строкиили пробел. продолжаю цикл пока не пробегусь по всей строке. далее в идеале на новую строку и опять весь цикл
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 07-02-2012 20:58 » 

ага, отличненько, на словах понятно

Теперь давайте разделять и властвовать

1. Прочитать строку.
2. Найти разделитель (пробел)
3 Слово положить в новую строку.

Вижу три функции.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
сергей2011
Интересующийся

by
Offline Offline

« Ответ #4 : 07-02-2012 21:33 » 

далее вернуться на "остановку"=пробел и продолжить искать другой пробел и т.д. до конца=начала строки
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 07-02-2012 21:43 » 

Так напишите эти три функции.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
сергей2011
Интересующийся

by
Offline Offline

« Ответ #6 : 07-02-2012 22:04 » 

то, что я там написал, все Ок, первую строку она делает хорошо, вторую он берет длину новой второй(из входного файла) и вставляет в выходной файл с размером=входной файл, вторая строка, но вставляет не вторую строку перевернутую, а первую перевернутую, но обрезаную по размеру второй. вот в чем весь вопрос.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 07-02-2012 22:14 » 

Я не хочу разбираться в "10" циклах - у меня есть свои задачи

Вы мне покажите функцию
  Читаю строку
  Переворачиваю
      Поиск разделителя
  Сохраняю строку

Тогда я вас пойму.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
сергей2011
Интересующийся

by
Offline Offline

« Ответ #8 : 07-02-2012 23:14 » 

понял.

Код:
 fgets(line, 100, f);                        //чтение строки
 int len = strlen(line);                    // нахождение длины
 cout<<"lenght= "<<len<<endl;
 //if ((line[len]=='\0'||line[len]=='\n')||(line[len]!='\0'||line[len]!='\n'))
 line[len]='\0';invLine[len]='\0';            //жестко показываем, что последний символ "\0"
 len--;                                                   // учитываем конец строки
 r=len;
 for(int k =len; k>-1; k--)                      //чтение строки-условия справо налево
 {if((line[k]==' '&&(line[k]!='\0'||line[k]!='\n')))//||(line[k]!=' '&&(line[k]!='\0'||line[k]!='\n'))) //если
                                                                                                                                   // пробел  то
                                                                                                                                   // входим в цикл
 {p=r-i;                                                      //вычисляем конец слова
 for(d=k; d<p+1;d++)                               //начиная с пробела идем до конца слова и копируем
 {invLine[i] = line[d];                                //посимвольно в начало результирующей строки
 cout<<"symbol = "<<line[d]<<endl;
 i++;}
 }
 }fputs(invLine, u);                                  //вывести в файл строку
 cout<<u<<endl;
 o++;
 line=NULL;
 cout<<"next line"<<endl;                      

Добавлено через 14 часов, 14 минут и 18 секунд:
короче, я пересмотрел полностью код, "перекроил" все  и вроде все неплохо, но опять!...в конце строки имеется символ конца строки, при "перевороте" последнее слово с символом конца строки ставится на первую позицию и последующая строка сдвигается на строку вниз. Еще ну никак не могу заставить весь этот код ходить по циклу для чтение всех строк документа(первая:чтение, "переворот", сохранить в документ. вторая:чтение, "переворот", ДОЗАПИСЬ в документ и т.д.). Помогите, пожалуйста, разобраться!
итак: 1)избавиться от символа конца строки в итоговой строке
          2) запустить все по циклу для чтения и перекройки все строк

* 1.txt (0.88 Кб - загружено 708 раз.)
« Последнее редактирование: 08-02-2012 17:49 от сергей2011 » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 08-02-2012 18:08 » 

Я не зря писал слово разделитель, а не пробел

Тебе нужно построить простейший автомат

Читаешь посимвольно из файла


Если это символ добавляешь во временную строку-слово
Если разделитель , временную строку-слово пишешь во временную строку-перевертыш  (строка-перевертыш = строка-слово + '<разделитель>' + строка-перевертыш)
Если конец строки (EOL или \0) то временную строку-перевертыш выводишь в файл


 


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
сергей2011
Интересующийся

by
Offline Offline

« Ответ #10 : 12-02-2012 11:57 » 

Ok, я уже разобрался, спасибо за отклик
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines