Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с нахождением строки в другой строке... Облазил весь поиск 
V
    Опции темы
ReGeDiT
  Дата 23.8.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



в файле имеется много строк вида

Код

17:04:03:M:WS9:[0.0.0.0:1111] msg [text1] type=0 lang=1
17:05:05:M:WS9:[1.1.1.1:2222] msg [text2] type=0 lang=2
18:34:02:M:WS9:[2.2.2.2:3333] msg [text3] type=0 lang=3
19:23:07:M:WS9:[3.3.3.3:4444] msg [text4] type=0 lang=4


в них надо выцепить "msg [xxxx]"

я делаю так:

Код

do {
    buf = getline(fp);
    if (strstr(buf,"msg")) { sscanf(buf,"%s:M:WS9:[%s:%d] msg [%s] %s %s",&time,&ip,&port,&msg,&type,&lang); printf("%s\n",msg); };
    lg = fopen("msg.log","wt"); fprintf(lg,"%s",msg); fclose(lg);
    free(buf);
    if (feof(fp)) { printf("\n\nEOF\n"); };
   }


но не работает. в чём проблема?

З.Ы. Тип остальных неважен, будь то string или int. Важен только тип msg...
PM MAIL WWW ICQ   Вверх
zkv
Дата 23.8.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



если надо выцепить text1, text2 и т.д. я бы сделал (если соблюдать ваш стиль smile ) так:

Код

#include<stdio.h>
#include<string.h>
main()
{
    FILE *fp, *lg;
    char time[20];
    char msg[20];
    fp = fopen("in.txt", "r");
    lg = fopen("msg.log","wt");
    do { fscanf(fp,"%s msg [%s %s %s",time, msg,time,time); msg[ strlen(msg) - 1 ] = '\0';printf("%s\n",msg); fprintf(lg,"%s",msg); }  while( !feof(fp) );
    fclose(lg);
    fclose(fp);
}


Это сообщение отредактировал(а) zkv - 23.8.2006, 13:38
PM MAIL   Вверх
ReGeDiT
Дата 23.8.2006, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



да, забыл добавить... там в файле ещё помимо этих строк куча мусора +)

Код

16:56:27:M:WS9:Incoming connection from [0.0.0.0:111]
16:56:27:M:WS9:DEBUG: total connections 1
16:56:27:M:WS9:[0.0.0.0:1111] CMSG_AUTH_SESSION


и т.п. =)

поэтому тут банальным fscanf нельзя =(

Это сообщение отредактировал(а) ReGeDiT - 23.8.2006, 13:40
PM MAIL WWW ICQ   Вверх
zkv
Дата 23.8.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



а std::fstream и std::string использовать нельзя? string в этом плане (поиск подстрок) довольно мощный инструмент    
std::string s;
s.find s.find_first_not_of s.find_first_of s.find_last_not_of s.find_last_of

PM MAIL   Вверх
ReGeDiT
Дата 23.8.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



а это C++... а у меня C smile
PM MAIL WWW ICQ   Вверх
ptr
Дата 23.8.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



ReGeDiT, ну сделай что ли так:
Код

char *pos=NULL;
if((pos=strstr(buf,"msg ["))!=NULL)
{
    sscanf(pos,"msg [%s",buf2);
    buf2[strlen(buf2)-1]='\0';//убираем ]
    printf("%s",buf2);
}


Это сообщение отредактировал(а) ptr - 23.8.2006, 15:20


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
ReGeDiT
Дата 23.8.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



интересно...

а можно как-нибудь ещё? чтобы сканировались все данные (как я в 1м посте описал)...
все которые нужны..
PM MAIL WWW ICQ   Вверх
zkv
Дата 23.8.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



а какие еще нужны? smile
PM MAIL   Вверх
ptr
Дата 23.8.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 1
Всего: 14



Цитата(ReGeDiT @  23.8.2006,  20:06 Найти цитируемый пост)
а можно как-нибудь ещё?

Можно, но только завтра smile .

Цитата(ReGeDiT @  23.8.2006,  20:06 Найти цитируемый пост)
чтобы сканировались все данные (как я в 1м посте описал)...

Ну ты бы сразу писал, что тебе полностью строку распарсить надо.

Цитата(ReGeDiT @  23.8.2006,  20:06 Найти цитируемый пост)
все которые нужны.. 

Конкретнее, какие нужны?
Еще было бы неплохо видеть какими могут быть строки (побольше примеров).


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
ReGeDiT
Дата 23.8.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



sscanf(buf,"%s:M:WS9:[%s:%d] msg [%s] %s %s",&time,&ip,&port,&msg,&type,&lang); printf("%s\n",msg); };
PM MAIL WWW ICQ   Вверх
ReGeDiT
Дата 23.8.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



Код

17:10:26:M:WS9:[0.0.0.0:1111] msg [lala] type=0 lang=1
17:10:27:M:Config file scripts/extra/defines.scp loaded, 0 sections done.
17:10:27:M:AreaTable loaded, total=1068
17:10:27:M:Lock loaded, total=194
17:10:27:M:MapCache inited, 42 maps.
17:10:27:M:water.dat loaded, 19392 recs.
17:10:27:M:File scripts/extra/qdbtexts.scp, max 53767, total 4754 sections.
17:10:27:M:WS9:[0.0.0.0:1111] msg [ggfg fdf] type=0 lang=1
17:11:04:M:WS9:[0.0.0.0:1111] msg [gfgggfdgd dsd] type=0 lang=1
17:11:11:M:WS9:[0.0.0.0:1111] CMSG_GOSSIP_HELLO 10
17:11:11:M:gossip with entry=40001
17:11:11:M:DEBUG: SendGossip from entry 40001
17:11:26:M:WS9:[0.0.0.0:1111] CMSG_GOSSIP_HELLO F
17:11:26:M:gossip with entry=40001
17:11:26:M:DEBUG: SendGossip from entry 40001
17:11:54:M:WS9:[0.0.0.0:1111] msg [dfgdg d a a] type=0 lang=1
17:12:05:M:WS9:[0.0.0.0:1111] msg [gfgfg das] type=0 lang=1
17:12:11:M:WS9:[0.0.0.0:1111] msg [adadf ads] type=0 lang=1
17:12:15:M:WS9:[0.0.0.0:1111] msg [adfa f] type=0 lang=1
17:17:15:M:WS9:[0.0.0.0:1111] CMSG_STANDSTATECHANGE 1
17:17:15:M:WS9:[0.0.0.0:1111] msg [Away from Keyboard] type=20 lang=0
17:21:37:M:WS9:[0.0.0.0:1111] CMSG_STANDSTATECHANGE 0
17:21:37:M:WS9:[0.0.0.0:1111] msg [] type=20 lang=0
17:22:54:M:WS9:[0.0.0.0:1111] msg [afdfa ff] type=0 lang=1
17:29:15:M:WS9:[0.0.0.0:1111] msg [gdfgdfg fsf] type=0 lang=1
17:29:16:M:Waiting for other threads...
17:29:16:M:Saving accounts...
17:29:16:M:done.
17:29:16:M: *** done.


вот почти всё что может..)

т.е. в msg может быть и 1 и 2 и 100 и больше слов )

Это сообщение отредактировал(а) ReGeDiT - 23.8.2006, 17:51
PM MAIL WWW ICQ   Вверх
zkv
Дата 23.8.2006, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



насколько я помню по формату %s считывается строка т.е. все символы начиная с текущего до первого встретившегося символа пробельной группы (вероятно есть возможность установить другой разделитель), в таком случае:
17:04:03:M:WS9:[0.0.0.0:1111] msg [text1] type=0 lang=1
попытавшись разобрать строку форматом
Код

sscanf(buf,"%s:M:WS9:[%s:%d] msg [%s] %s %s",&time,&ip,&port,&msg,&type,&lang); 

 вообщето я не уверен что следует писать &time, ведь мы должны передать указатель на объект в который хотим прочитать, в случае char time[ANY_CONST],  time и будет указателем на объект, т.е. писать следует sscanf(buf,"%s:M:WS9:[%s:%d] msg [%s] %s %s",time,ip,&port,msg,type,lang);
но возможно и ваша запись работоспособна, не буду спорить.
Итак в результате в time попадет  "17:04:03:M:WS9:[0.0.0.0:1111]" потом в ip пойдет "msg" , ну а с port появятся проблемы, так как настанет очередь читать "[".
полностью разобрать приведенную выше строку можно например таким форматом: "%d:%d:%d:M:WS9:[%d:%d:%d:%d:%d] msg [%c%c%c%c%c] %s %s", а какой формат вам нужен, вам и виднее наверное smile

ps имхо изложенное выше можно было понять из приведенных примеров
PM MAIL   Вверх
ReGeDiT
Дата 23.8.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.7.2006
Где: Пущино на Оке

Репутация: нет
Всего: нет



по изложенному выше я понял только принцип работы и то, почему у меня неработал мой ввод.

но проблема осталась ))

нужно распарсировать всю строку...

конструкция вида : 
Код
%d:%d:%d:M:WS9:[%d:%d:%d:%d:%d] msg [%c%c%c%c%c] %s %s
 слишком ужасна %) тем более как быть если в msg [ ] пробелы, если там 100 слов и т.п. =(
PM MAIL WWW ICQ   Вверх
Oleg_Ci
Дата 23.8.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Помойму что-то вроде этого надо.
Код

void main()    
{    
    FILE *file;
    file = fopen( "text.txt", "r" );  //  или "in.txt"
    if ( !file ) return;

    const int len = 100;
    const int size = 10;
    char ch[len], *c;
    char  time[size], ip[size], msg[size], type, lang;
    int port;

    while ( fgets( ch, len, file ) != NULL )
    {
        if (strstr( ch,"msg")) 
        {
            strncpy( time, ch, 8 );
            time[8] = '\0';

            strncpy( ip, &ch[16], 7 );
            ip[7] = '\0';

            port = atoi( &ch[24] );
            strncpy( msg, &ch[35], size );

            for ( c = &msg[size]; *c != ']'; c-- );
            *c = '\0';

            c = strstr( ch, "=" );
            c++;
            type = *c;

            c = strstr( c, "=" );
            c++;
            lang = *c;

            printf( "%s:M:WS9:[%s:%d] msg [%s] %c %c\n", time, ip, port, msg, type, lang );
        }
    }

    getchar();
    fclose( file );
}
sscanf(buf,"%s:M:WS9:[%s:%d] msg [%s] %s %s",&time,&ip,&port,&msg,&type,&lang);  <<<  ReGeDiT это у тебя помойму не работает.

Это сообщение отредактировал(а) Олег4 - 23.8.2006, 19:01
PM MAIL   Вверх
Oleg_Ci
Дата 23.8.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Или вроде этого, только пример с ошибкой какой-то, я её не понял.
Код

void main()    
{    
    FILE *file;
    file = fopen( "text.txt", "r" );
    if ( !file ) return;

    const int len = 200;
    char ch[len], *c;
    char  time[8], ip[7], msg[10], type[6], lang[6];
    time[0] = '\0';
    ip[0] = '\0';
    msg[0] = '\0';
    type[0] = '\0';
    lang[0] = '\0';
    int port;

    while ( fgets( ch, len, file ) != NULL )
    {
        if (strstr( ch,"msg")) 
        {
// sscanf с ошибкой помойму...
            sscanf(ch,"%8s:M:WS9:[%7s:%4d] msg [%s] %6s %6s",time,ip,&port,msg,type,lang);
            printf( "%s:M:WS9:[%s:%d] msg [%s] %s %s\n", time, ip, port, msg, type, lang );
        }
    }

    getchar();
    fclose( file );
}

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.