+ Responder ao Tópico



  1. #1
    kappalinux
    Visitante

    Padrão problema com buffer!!

    Alguem pode me dizer como q faço para tirar o buffer quando manipulo arquivos em C??

    por exemplo..meu problema eh o seguinte :
    /* decalaracao das variaveis*/
    FILE *passwd;
    char str[51],str2[10];

    /*Pego os usuarios do /etc/passwd q tenham id igual a 0*/
    sprintf(str,"%s","cat /etc/passwd | grep :0:0: | tac | cut -d':' -f1");

    /*logo em seguinda passo isso para um arquivo*/
    passwd = popen(str,"r");

    /*Na sequencia esse trecho joga o conteudo do ponteiro para string q contem o comando q kero executar em str2*/
    while(!feof(passwd))
    {
    fgets(str2,3,passwd); /* Trecho x do codigo*/
    printf(str2);
    }

    Eh o seguinte eu inicializei str2[10]. eu nao deve colocar "no trecho x do codigo" fgets(str2,9,passwd)?? quando eu utilizo dessa maneira eu tenho problema do buffer. O programa "printa" por ultimo a mesma coisa que "printou" por primeiro..a unica solucao q eu achei foi colocar o valor 3.
    eu fiz um teste com fgets(str2,3,passwd) e tive o resultado esperado:
    $./id-check
    root
    fulano

    agora quando eu uso a sintaxe que deveria ser a "correta" nao tenho o resultado esperadoagora usando-> fgets(str2,9,passwd) )
    $./id-check
    root
    fulano
    root



    Ateh onde eu sei. fgets tem a seguinte sintaxe:
    fgets(char *str, in length, FILE *fp)
    onde fgets le a string da stream especificada ateh que um caractere da nova linha seja lido ou que length-1 caracteres tenham sido lidos.

    Alguem sabe me dizer pq estah acontecendo isso..??
    Mais uma pergunta..eu podria limpar o buffer com fflush()? tentei mas nao tive sucesso tb...se alguem puder me ajudar com o fflush tb eu agradeço.
    falooow
    []'s
    ateh++
    ;-)

  2. #2

    Padrão problema com buffer!!

    eae cara.....eu num so muito chegado no fgets especialmente por esse maldito "int lenght", por isso tenta fazer assim:

    /* decalaracao das variaveis*/
    FILE *passwd;
    char str[51],*str2=malloc(10);
    int ch;

    /*Pego os usuarios do /etc/passwd q tenham id igual a 0*/
    sprintf(str,"%s","cat /etc/passwd | grep :0:0: | tac | cut -d':' -f1");

    /*logo em seguinda passo isso para um arquivo*/
    passwd = popen(str,"r");

    /*Na sequencia esse trecho joga o conteudo do ponteiro para string q contem o comando q kero executar em str2*/
    while((ch=fgetc(passwd))>0)
    {
    if(ch!='\n' && ch!='\r'){
    sprintf(str2,"%s%c",str2,ch);
    }else{
    printf("%s",str2);
    sprintf(str2,"%c",ch);
    }
    }

    aki funcionou....v se ai vai tbm :wink:

  3. #3
    kappalinux
    Visitante

    Padrão problema com buffer!!

    valeu SDM isso mesmo q eu keria..
    ;-)
    de onde vc tirou isso??
    ele da um warning no momento em q vc compilou ai??

  4. #4

    Padrão problema com buffer!!

    da warning sim....eh aquele maldiro "make pointer from integer" mas soh q se vc tentar arrumar ele colocando por exemplo mais em baixo a alocacao de memoria:

    *str2=malloc(20);

    ele nao funciona mais.....por isso normalmente eu ignoro esse erro....mas se vc souber como resolver esse problema me avisa pq eu to faz moh tempao tentando arrumar isso.....e pra ver as funcoes de leitura de arquivo roda um
    $ man fgetc

    q ele fala como funciona as funcoes :wink:

  5. #5
    kappalinux
    Visitante

    Padrão problema com buffer!!

    hummm legal legal cara...eu perguinte pq eu conheci fgets e fscanf
    mas fgetc eu nao conhecia..ele funciona como? ele le um caracter por a cada loop no while??

    entao eu resolvi o probleminha do warning na declaracao da variavel..
    *str2=(char *)malloc(10);
    ;-)

  6. #6

    Padrão problema com buffer!!

    aahhhh....valeu pela ajuda no problema....
    intao.....o fgetc funciona assim msm....ele le um caracter de cada vez, e retorna um numero inteiro entre 1 e 255 (tds o caracters ascii ;] ) por isso q tem q fazer aquela comparacao entre o retorno e os caracteres \n e \r pra separar as strings por quebra de linha....qq coisa entra em contato

  7. #7
    kappalinux
    Visitante

    Padrão problema com buffer!!

    blza cara podexaaa ;-)
    valeu pela ajuda cara.
    []'s
    faloow ateh++++