• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Rorsch

[Resolvido] Ler texto separado por tabs linha a linha, de um ficheiro

21 mensagens neste tópico

Boas,

Podem ajudar-me com uma função que pegue num ficheiro como o exemplo abaixo (cada informação está separada por tab):

Ricardo          969666666          ricardo@hhh.com

Susana          914555555          susana@gfff.com

e coloque esta informação numa estructura de dados como:

typedef struct pessoa

        {

        char nome[50];

        int numero;

        char mail[20]; 

        } Pessoa;

Toda a ajuda é agradecia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fgets() <== ler linha

http://www.opengroup.org/onlinepubs/007908799/xsh/fgets.html

sscanf() <== passar para elementos da struct

http://www.opengroup.org/onlinepubs/007908799/xsh/fscanf.html

Edit: o link da documentação é o mesmo que para fscanf porque as duas funções são descritas nessa página

Incompleto, não testado

/* #includes */
/* ... */
/* buf_size e data_stream são, por exemplo, parametros para a função */
while (fgets(buf, buf_size, data_stream)) {
  if (sscanf(buf, "%s%d%s", rec.nome, rec.numero, rec.mail) != 3) {
    /* deal with error */
  }
}
/* ... */

Se o nome pode ser, por exemplo, "Manuel Matias" (com um espaço) esta solução não serve!

Se não estás à espera duma função completa feita por um de nós, mete aqui o código que já fizeste e quais as dúvidas que tens em relação e esse código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nesse exemplo ele lê o ficheiro até ao fim? O nome será sempre sem espaços. Obrigado pela resposta tão rápida :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, a função fgets() devolve NULL quando chega ao fim do ficheiro.

O ciclo while repete até essa altura, se não houver erros de leitura do ficheiro.

Se preferires um while mais explicito, podes fazer assim:

while (fgets(buf, buf_size, data_stream) != NULL) { /* ... */ }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pmg, o formato não tem que ter os espaços? Ou tambem funciona assim.

Rorsch, não, a função sscanf, quando chamada com o formato correcto e com os paramtreos correctos é que te lê os dados para uma estrutura do tipo que tu definiste. Mas claro, tens que a declarar. E no teu caso com queres mais do que um valor até tens que criar um array de ponteiros para estruturas desse tipo.

Dêm documentação a este homem :D

http://www.cplusplus.com/reference/clibrary/cstdio/sscanf.html

para mais exemplos: google -> sscanf

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pmg, o formato não tem que ter os espaços? Ou tambem funciona assim.

Também funciona assim :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelas dicas. Vou tentar criar o código que preciso e depois meto aqui para futura referência (se funcionar) :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porque nao comecas por mal metes a correr o programar a receber os paramentos

int main(int vec, char **vect){

}

// em que o vec conta o numero de paramentos a contar com o ./programa

e o vect[0] ->./programa

vect[1] ->...

os espaços ficam separados por um vector

acho que é isto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se precisasses de usar com nomes que tivessem espaços, podias utilizar uma regex para ler até encontrar um tab ('\t'):

sscanf(...,"%[^\t]%d%s",...);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se precisasses de usar com nomes que tivessem espaços, podias utilizar uma regex para ler até encontrar um tab ('\t'):

sscanf(...,"%[^\t]%d%s",...);

Obrigado pela dica :D

elcsat, comecei com C há pouco tempo, não percebi quase nada do que tentaste me explicar :$

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que tava a sugerir quando metes o programa a correr podes passar juntamente com o programa, dados, eu dei-te um exemplo para isso, como tas a usar uma estrutura eu pensei que ja soubesses o que tava a falar

mas podes usar uma funçao que separe por espaços(tava a ver se me lembrava mas nao me lembro), podes ate correr o vector elemento a elemento e a comparar se é um espaço, tens varias maneiras possiveis

ja conseguiste

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, isto poderá não ser do teu interesse já que aparentemente o teu objectivo é praticar um pouco da linguagem C.

Mas é o exemplo de uma coisa que um utilizador de um sistema operativo baseado em linux pode fazer com um linha usando o awk.

Quem diz isto diz centenas de outras coisas.

Para os curiosos, olhem só como é simples:

http://www.vectorsite.net/tsawk.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, isto poderá não ser do teu interesse já que aparentemente o teu objectivo é praticar um pouco da linguagem C.

Mas é o exemplo de uma coisa que um utilizador de um sistema operativo baseado em linux pode fazer com um linha usando o awk.

Quem diz isto diz centenas de outras coisas.

Para os curiosos, olhem só como é simples:

http://www.vectorsite.net/tsawk.html

boa dica :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, já agora vou aproveitar o tópico....

Precisava de um regex, para encontrar espaços em branco e tab's, mas é para utilizar em C++ na leitura de um ficheiro txt.... :)

Preciso de ajuda na criação do regex e na utilização de regex em C++....  :-[  Algum tutorial, ou algum site k explique isso direitinho?!

cumps  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda não tive tempo para testar a solução, mas logo que possa trato do caso

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

char buffer[]= "0 15 5000";

        int ope, i;

        sscanf(buffer, "%d", &ope);

        sscanf(buffer, "%*d %*d %d", &saldo[posb].ident);

        sscanf(buffer, "%*d %d", &i);

A cada linha faço isto e já consigo adicionar partes da string à estructura de dados que defini em baixo:

struct registo {

        int ident;

        int money;

} saldo[PESSOAS];

Muito obrigado pela ajuda :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazer tudo numa única instrução

char buffer[] = "0 15 5000";
int ope, i;

if (sscanf(buffer, "%d %d %d", &ope, &saldo[posb].ident, &i) != 3) /* erro */;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora