LINUX.ORG.RU

Помогите найти ошибку в С-коде


0

0

Смысл ошибки: последняя строка из файла помещается в массив buf_arr дважды.

  for(j=0;j<OUT2ARR_MAX_LINE_COUNT-1;++j){                                                                                                   
        if (!fgets(buf,sizeof(buf),is) && ferror(is)){                                                                                       
                snprintf(buf,sizeof(buf),"error reading pipe to '%s' : %s",cmd,strerror(errno));                                             
                syslog(LOG_ERR,buf);                                                                                                         
                buf_arr[j]=strdup(buf);                                                                                                      
                fprintf(stderr,"В массив buf_arr под номером %d помещена строка '%s'\n",j,buf);                                              
                break;                                                                                                                       
        }else{                                                                                                                               
                for(i=0;i<sizeof(buf);i++)if(buf[i]=='\n')buf[i]='\0';                                                                       
                buf_arr[j]=strdup(buf);//buf_arr[j+1]=NULL;                                                                                  
                fprintf(stderr,"В массив buf_arr под номером %d помещена строка '%s'\n",j,buf);                                              
                if(feof(is)) break;                                                                                                          
        }                                                                                                                                    
  }                                                                                                                                          
★★★★★
Ответ на: комментарий от cvv

не очень понятно, почему !fgets(...) *И* ferror(...) Потому что имеет смысл прекращать чтение когда файл закончился *ИЛИ* поток испорчен. При "&&", если файл доступен для чтения, условие в if() не выполняется никогда.

murla
()

... а вообще, код у тебя какой-то страшный :) Тебе чего сделать-то надо, словами скажи.

murla
()
Ответ на: комментарий от murla

мне надо получить вывод дочернего процесса. Дочерний процесс я открываю при помощи popen() а потом пытаюсь его читать. результаты очень странные.

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

Я процессы в твоем коде не увидел, но вот к примеру простенький код,
который читает ввод через pipe, открытый "cat", и выводит строку
наоборот:

    char buf[1024];
    FILE *is = popen("cat", "r");
    int i;

    while (fgets(buf, sizeof(buf), is)) {
        i = 0;
        while (i++ < strlen(buf) - 1)
            putchar(buf[strlen(buf) - i - 1]);
        putchar('\n');
    }

может, что-то прояснится ...
Удачи.

murla
()
Ответ на: комментарий от cvv

cvv (*) (11.10.2004 16:43:57):

> какой буфер ??? внутренний буфер is???

Да твой buf.

fgets(buf... отрабатывает последний раз (не 0 возвращает), ты спасаешь его в buf_arr.

В след. раз он (fgets) возвращает 0, и ты зачем-то еще раз его (buf) спасаешь. Поскольку он (buf) не изменился (man fgets), последняя строчка появляется 2 раза.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.