Считывание строк в C++(смена символов разделителей)

Модератор: Модераторы разделов

Slon42
Сообщения: 5
ОС: Ubuntu 8.10 "Intrepid Ibex"

Считывание строк в C++(смена символов разделителей)

Сообщение Slon42 »

Здравствуйте. У меня 2 вопроса.
1) Как поменять на время символы разделители? Тоесть если я допустим сделаю символами разделителями ',' и '\n', во входной поток запихну вот такую строку - "george bush,barack obama\nмедведев", а потом сделаю так:

Код: Выделить всё

string a, b, c;
cin >> a >> b >> c;

То у меня в переменных будут храниться следующие значения:

Код: Выделить всё

a = "george bush"
b = "barack obama"
c = "медведев"

2) Как узнать что между переменными, которые я считывал, был символ перехода на новую строку?

Спасибо.
Спасибо сказали:
Аватара пользователя
whirlwind
Сообщения: 67

Re: Считывание строк в C++(смена символов разделителей)

Сообщение whirlwind »

есть такое подозрение, что никак нельзя это сделать
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
mikluxo
Сообщения: 283
ОС: Slackware 12.2

Re: Считывание строк в C++(смена символов разделителей)

Сообщение mikluxo »

делать так:

Код: Выделить всё

int i=0;
while(!in.eof())
{
   somestring=cin.getline(); //все что в somestring заканчивается на \n
   str=strtok(",", somesting);
   array[i]=str;
   ++i;
   while(str.find(',')!=string::npos)
   {
       array[i]=strtok(",", NULL);
       ++i;
   }
}

на С++ давно не кодил, так что не пинайте, если параметры криво прописал.
версия не завершенная, но на водку дал (=
Если комп с компилером найду, попробую нарисовать.

или посимвольно считывать (cin.get()) и проверять символ на принадлежность к ',' и '\n

Если хотите переопределить cin(>>) определяете класс, делаете friend функцию которая будет использовать логику, выше. Помоему как-то так.
Ich weiss, dass ich nichts weiss, aber wissen Sie es auch?
Завистники на что не взглянут,
подымут вечно лай,
А ты себе своей дорогою ступай,
Полают, да отстанут. Крылов
Спасибо сказали:
Slon42
Сообщения: 5
ОС: Ubuntu 8.10 "Intrepid Ibex"

Re: Считывание строк в C++(смена символов разделителей)

Сообщение Slon42 »

Как руками это сделать я понимаю) Просто было интересно узнать, можно ли облегчить труд. Видимо нельзя. Всеравно спасибо.
Спасибо сказали:
Аватара пользователя
CycaHuH
Сообщения: 85
ОС: FreeBSD; Archlinux; Calculate

Re: Считывание строк в C++(смена символов разделителей)

Сообщение CycaHuH »

Погуглите на тему setfill
Спасибо сказали:
Аватара пользователя
whirlwind
Сообщения: 67

Re: Считывание строк в C++(смена символов разделителей)

Сообщение whirlwind »

CycaHuH писал(а):
12.01.2009 01:35
Погуглите на тему setfill
это не то, оно только для вывода

в принципе, если очень хочется именно с потоками, можно гуглить на создание собственного манипулятора потоком (custom manipulator). Но толку мало, даже если получится, все равно это будет функция, по одному рассматривающая символы, никуда от нее не денешся.
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Считывание строк в C++(смена символов разделителей)

Сообщение Folderx »

Код: Выделить всё


#include <stdio.h>
#include <string.h>

#define MAXLINE  1000   /* максимальная длина строки */
#define MAXWORD  100    /* максимальная длина слова  */

/* разделяет строку по набору разделителей */
main()
{
    char line[MAXLINE] = "george bush,barack obama\nмедведев";
    char *delims = ",\n";
    char words[3][MAXWORD];
    char tmp[MAXLINE], *p;
    int i;

    strcpy(tmp, line);
    for (p = strtok(tmp, delims), i = 0;
         p != NULL;
         p = strtok(NULL, delims))
        strcpy(words[i++], p);
    for (i = 0; i < 3; i++)
        printf("%s\n", words[i]);
    return 0;
}


Код: Выделить всё

[guest@station tmp]$ ./test
george bush
barack obama
медведев
[guest@station tmp]$


line можно прочитать с помощью cin.getline(line, sizeof line / sizeof line[0]);
на каждом заходе набор разделителей можно менять, главное помни, что строка редактируется и после обработки она будет не пригодна для использования
Спасибо сказали: