nixp.ru v3.0

25 мая 2017,
четверг,
09:59:18 MSK

DevOps с компанией «Флант»
Аватар пользователя Steck
Steck написал 22 июня 2005 года в 22:09 (181 просмотр) Ведет себя как мужчина; открыл 124 темы в форуме, оставил 549 комментариев на сайте.

народ помогите кодом

Необходимо на Си парсить такое дело

[R]
:asdasd
:asdasdasd
[S]
:asdasd
[R]
:sdsd
:asdsad
[R]
:asdasd
:sadasd
[R]
:asdasd

Поможите экземплом плиз

decvar

а что выпарсить-то надо?

Genie

ааа. что-то знакомая конструкция.. уж не история ли это общения с пользователем в licq?

и зачем тут C? perl в руки и вперёд.

Steck

Вот именно liqc ;o) да перл то оно конечно в этом рулит но!

Это уже дело принципа ;o) После того как я убил три часа на это ;o)

4decavr

Выпарсить надо слова в теле тегов.

Все получается но.. странное дело если идут одинаковые теги подряд то он не все читает!

Вообщем вот код постотрите а то я уже все себе сломал ) Но от принципа не отступлюсь все равно на Си напишу даже если на перле это заняло вы 10 минут ;o)

Вот код ии.. я вообще не пойму почему он не все вытаскивает

FILE            *in;
        char            *word,*ret;
        int             SendingMessage=0,ReceivedMessage=0;
        word = (char *)malloc(sizeof(BUF));
        ret = (char *)malloc(sizeof(BUF));
        in = fopen(argv[1],"r");
        while(fgets(word,sizeof(char) * BUF,in))
                if( (word[0] == '[') && (word[2] == 'S') )
                {
                        SendingMessage++;
                        while(fgets(word, sizeof(char) * BUF, in))
                        {
                        if(word[0] == ':'){
                                printf(word);
                                continue;
                        }
                        else
                        {
                                printf("\n");
                                break;
                        }
                        }
                }
        fclose(in);
        free(word);
        free(ret);
}
Genie

ага, а про место в word на завершающий '\0\′ забыл, да? ;)

далее, конструкцию

//
                        while(fgets(word, sizeof(char) * BUF, in))
                        {
                        if(word[0] == ':'){
                                printf(word);
                                continue;
                        }
                        else
                        {
                                printf("\n");
                                break;
                        }


можно и так написать:

//
                        while(fgets(word, sizeof(char) * (BUF-1), in)&&(word[0] == ':'))
                                printf(word);
                        printf("\n");

вероятно, где-то ещё надо feof() делать… ;)

ps: и кроме того, представим, что идут подряд несколько . тогда, при зваершении внутреннего цикла у нас word как раз и содержит строку с тегом. однако, её-то мы даже и не смотрим дальше — тупо читаем следующую

вот и вся твоя проблема.

Steck
Genie
ps: и кроме того, представим, что идут подряд несколько . тогда, при зваершении внутреннего цикла у нас word как раз и содержит строку с тегом. однако, её-то мы даже и не смотрим дальше — тупо читаем следующую

вот и вся твоя проблема.

Это я уж понял а как же этого избежать?

goto юзать? У меня уже кончились идеи Голова как мяч

Genie

не проверял, но где-то типа этого

in res;
res = fgets(word, sizeof(char) * (BUF - 1), in);
while (res)
{
    if ((word[0] == '[') && (word[1] == 'S'))
    {
        SendingMessage++;
        while((res = fgets(word, sizeof(char) * (BUF - 1), in)) && (word [0] == ':'))
            printf(word);
        printf("\n");
    }
    else
        res = fgets(word, sizeof(char) * (BUF - 1), in);
}

ps: правда, в таком случае есть одна грабля: если у тебя строчка попадётся более, чем BUF-1, то… она того, конец её выкинется.

decvar

в коллекции примеров есть парсилка таких конструкций:

——————

[некий токен]

то что выпарсить

[еще токен]

и еще ценная инфа

————-

под себя переделать сможешь?

Steck

Все получилось ВСЕМ спасибо!!

4Genie

С меня пиво ;o)