Dúvida em C

6 views
Skip to first unread message

OAlinux

unread,
Jul 10, 2009, 2:26:53 PM7/10/09
to ccppb...@googlegroups.com
Pessoal, boa tarde!

Em um arquivo de texto, possuo o seguinte conteúdo:

[lista.dat]

"Nome";"Idade";"Sexo";"Departamento";
"Alexandre";"28";"M";"Mec";
"Daniele";"19";"F";"Adm";
"Elis";"20";"F";"Qua";
"Claudio";"21";"M";"Man";
"Ronaldo";"32";"?";"Cor";

Gostaria de ler este arquivo ignorando os pontos/vírgulas alocando cada item em um vetor de caracteres. Vejam o programa que fiz:

#include<stdio.h>
main() {
 FILE *dados;
 dados = fopen("lista.dat","rt");
 char a[30];
 do  {
 // fgets(buffer, 30, dados);
  fscanf(dados, "%[^;]", a);
 // fflush(dados);
 // fscanf(dados,"%*c");
  printf("%s\n", a);
 } while(!feof(dados));
//fclose(dados);
}

Acontece que o fscanf está lendo a string, mas como o caractere de controle é o ";" não o "\n". o \n é incluído e ele continua lendo até o final do stream, ou seja, até o final do arquivo.
Estou tendo também problemas com bufferização (limpeza de buffer), quando eu resolvo ler mais de uma string com um mesmo scanf.

Alguém poderia me ajudar, ou me indicar qual seria o melhor método?


Agradeço desde já!

Rafael Giusti

unread,
Jul 10, 2009, 2:34:18 PM7/10/09
to ccppb...@googlegroups.com
Rapaz, até onde eu posso ver, o único problema é que o seu programa não está sabendo lidar com o ponto-e-vírgula. Quer dizer, ele lê o primeiro campo, para a leitura no ponto-e-vírgula, e depois se perde porque não encontra mais nada que pode ser lido.

Eu recomendaria a você fazer o seguinte:

fscanf(dados, "\n%[^;];", a);

Dessa forma você também ignora os brancos (incluindo quebra-de-linha) que antecedem os campos.

2009/7/10 OAlinux <oal...@gmail.com>



--
Rafael Giusti
Laboratório de Inteligência Computacional - LABIC
Universidade de São Paulo - USP

Eric Chiesse

unread,
Jul 10, 2009, 5:41:05 PM7/10/09
to ccppbrasil
Eu recomendaria que você quebrasse seu problema em pedaços menores
primeiro.

Tentar resolver um problema complexo diretamente é muito mais dificil
que resolver vários problemas pequenos.

Eu tentaria primeiro obter as linhas (já que elas fazem sentido no seu
problema) e depois tentaria obter os elementos individuais de cada
linha.

Abraço.

Eric.

On Jul 10, 3:34 pm, Rafael Giusti <rfgiu...@gmail.com> wrote:
> Rapaz, até onde eu posso ver, o único problema é que o seu programa não está
> sabendo lidar com o ponto-e-vírgula. Quer dizer, ele lê o primeiro campo,
> para a leitura no ponto-e-vírgula, e depois se perde porque não encontra
> mais nada que pode ser lido.
>
> Eu recomendaria a você fazer o seguinte:
>
> fscanf(dados, "\n%[^;];", a);
>
> Dessa forma você também ignora os brancos (incluindo quebra-de-linha) que
> antecedem os campos.
>
> 2009/7/10 OAlinux <oali...@gmail.com>

Guilherme Longo

unread,
Jul 24, 2009, 2:52:52 PM7/24/09
to ccppb...@googlegroups.com
Boa tarde pessoal.

No seguinte trecho de código:

val = *valp++ ^ mask;
val = abs(val);

Eu não estou entendendo muito bem o uso do OU exclusivo binario.
Para mim, ele deveria testar 2 condições e retornar F se tivermos 2
condições verdadeiras ou 2 falsas. E se tivermos 1 verdadeira e outra
falsa ele deveria retornar verdadeiro.

Existe outra aplicação para o caret??

Muito obrigado

Emerson de Freitas Barcelos

unread,
Jul 24, 2009, 3:10:21 PM7/24/09
to ccppb...@googlegroups.com
Por exemplo:

155 ^ 97 = 250

  10011011b (0x9B) 155
^ 01100001b (0x61)  97
-----------
  11111010b (0xFA) 250

0^0=0, 0^1=1, 1^0=1, 1^1=0

 

De: Guilherme Longo <grlongo...@gmail.com>
Para: ccppb...@googlegroups.com
Enviadas: Sexta-feira, 24 de Julho de 2009 15:52:52
Assunto: [ccppbrasil] Operador Caret (OU exclusivo binário).

Veja quais são os assuntos do momento no Yahoo! + Buscados: Top 10 - Celebridades - Música - Esportes

Paulo Rogério Panhoto

unread,
Jul 24, 2009, 3:54:17 PM7/24/09
to ccppb...@googlegroups.com
Uma vantagem do XOR (especialmente para aplicações criptografia) é a
sua reversibilidade (Claro, XOR sozinho não criptografa nada...).

x ^ y ^ y = x

Faz muito tempo que li isso (nem sei se ainda vale ou se era verdade).
Mas, eu lembro que nos x86 mais antigos, a forma mais rápida de zerar
um registrador (por exemplo, AX) era:

XOR AX, AX

em vez de

MOV AX, 0

E, claro, o xor não retorna a condição. Ele faz o teste bit a bit.



2009/7/24 Guilherme Longo <grlongo...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages