Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Переставить местами слова в файле


Автор: iPlay 18.4.2008, 19:31
Помогите плиз. Как сделать так чтобы в считанной из файла строке менялось местами 1е и 2е слово 3е и 4е ну и т.д.??

Автор: Earnest 18.4.2008, 19:34
Разбить строку на слова, поместить их в массив, поменять, снова собрать строку.

Автор: Rififi 18.4.2008, 20:05
iPlay

с использованием STL - так:

Код
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>

std::string swap_words(const std::string& s)
{
    std::stringstream ss(s);
    typedef std::vector<std::string> V;
    V v;

    std::copy(
        std::istream_iterator<std::string>(ss),
        std::istream_iterator<std::string>(),
        std::back_inserter(v));
    if (v.size() & 1)
        throw std::exception("Нечетное количество слов");
    for(size_t i=0; i <= v.size()/2; i += 2)
        std::swap(v[i], v[i+1]);
    ss.clear();
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(ss, " "));
    return ss.str();
}

Автор: iPlay 18.4.2008, 20:23
За код конечно спасибо. Но я буду в UNIX программу встраивать перестановку. Щас пробую сам сделать.

Автор: Rififi 18.4.2008, 20:25
iPlay
Цитата
в UNIX

да хоть в X-System LW-42/G

Автор: iPlay 18.4.2008, 21:34
а STL разве под UNIX будет работать?

Добавлено через 2 минуты и 51 секунду
Я просто с STL не работал как этот код применить правильно в UNIX программе?

Автор: warmonger_ 18.4.2008, 23:09
Цитата(iPlay @  18.4.2008,  20:34 Найти цитируемый пост)
а STL разве под UNIX будет работать?

да

Цитата(iPlay @  18.4.2008,  20:34 Найти цитируемый пост)
как этот код применить правильно в UNIX программе? 

хм... попробуй просто его написать

Автор: vinter 18.4.2008, 23:32
iPlay, чистый С++ платформонезависим, а STL это его часть.

Автор: warmonger_ 18.4.2008, 23:38
Цитата(vinter @  18.4.2008,  22:32 Найти цитируемый пост)
чистый С++ платформонезависим

сильно громко сказано... smile 

Автор: iPlay 19.4.2008, 08:29
Спасибо, просветили насчет STL, незнал .А можно в кратце как работает тот код а то не все понятно.

Автор: Rififi 19.4.2008, 12:47
iPlay
код - практически дословная реализация того, что предложил Earnest

алгоритм copy разбивает строку на слова, используя пробельные символы в качестве разделителя. чтобы читать из стрима, применяется специальный адаптер "псевдо-итератора".
цикл for - собственно сама перестановка элементов.
далее снова применяется алгоритм copy, только уже для того, чтобы собрать строку из перестановленных слов. ostream_iterator принимает на вход ссылку на поток для сохранения результата и разделитель. потом возвращается собранная строка. всё.

Автор: iPlay 22.4.2008, 17:24
И последний вопрос уже в самом применнении чёто я не шарю как вызвать ту ф-цию что на STL написана 
вот кусок кода что я пишу логика простая читаем из канала "client-server" в буфер buff :

Код

int main(){    
   char buff[2048];
   int fr;    
   int fw;
   fr = open("client-server",O_RDONLY);
   mkfifo("server-client",0777);
   fw = open("server-client",O_WRONLY);
   read(fr,buff,sizeof(buff));
   //вот тут надо вызвать обработку я незнаю как?!  
    .
    . 
    .
}



Автор: Alek86 22.4.2008, 17:36
Цитата(warmonger_ @  18.4.2008,  23:38 Найти цитируемый пост)
сильно громко сказано...

в самый раз
ты бы видел на форумах споры насчет работы на C++ на платформах, где у разных типов указатели разного размера smile

Автор: iPlay 22.4.2008, 17:41
Это да smile. Тока как мне быть писать заново чтоли обработку на чистом С?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)