Jump to content

Duvida com ficheiros


einstein
 Share

Recommended Posts

pretendo criar um programa que abra um ficheiro com o nome definido pelo utilizador e que o imprima no ecra, so que este programa so esta a funcionar para as primeiras palavras de cada linha. O que devo alterar para ler a linha toda?

O código é o seguinte :

#include<stdio.h>
#include<stdlib.h>

int main () {

char ficheiro[80];
char linha[80];
char valor[80];	
FILE * fp;

printf("Indique o nome do ficheiro\n");
scanf("%s",ficheiro);	
fp=fopen(ficheiro,"r");
if (fp == NULL){
	printf("ficheiro nao existente\n");
	exit(0);
}
else {
	while(fgets(linha, 80, fp)!= NULL){		
		sscanf(linha," %s",valor);
		printf("%s\n",valor);
	}
fclose(fp);
}
exit(0);
}

Em relação ao comprimento das string. Qual deve ser?

Link to comment
Share on other sites

O código está a ler um máximo de 79 caracteres de cada linha terminada com um newline (ASCII 0x0A). Se sabes o número de caracteres da maior linha podes substituir o 80 por esse valor + 1.

Se não sabes isso escolhes um valor arbitrário grande (1024 ou coisa assim) ou carregas o ficheiro em blocos (por exemplo de 16K), procuras as linhas uma a uma no bloco e copia-as para uma lista de strings, que depois imprimes. Tens de prever que as linhas podem atravessar dois blocos carregados consecutivamente e nesse caso terás de copiar o início dessa linha para o topo do bloco e preencher apenas o resto do bloco.

Já agora, podes usar o fscanf em vez do par fgets e sscanf.

Link to comment
Share on other sites

O fgets() lê a linha toda, incluindo o \n.

Depois, com o sscanf() é que "perdes" o que vem depois da primeira palavra.

Deixa de fazer o sscanf() e imprime o conteudo de linha directamente:

while (fgets(linha, sizeof linha, fp)) {
    printf("%s", linha); /* linha contem '\n' */
}

Se uma linha for maior que o espaço disponível, a vez seguinte que corre o ciclo vai buscar o resto da linha.


Outra maneira é fazeres o sscanf() mas aceitares espaços: o "%s" ignora espaços antes e depois das strings.

Para isso usa o "%79c" ou "%79[^\n]". Podes substituir o 79 por um asterisco e passar o valor para argumento

sscanf(linha, "%*c", sizeof valor - 1, valor);

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

O fgets() lê a linha toda, incluindo o \n.

Depois, com o sscanf() é que "perdes" o que vem depois da primeira palavra.

Deixa de fazer o sscanf() e imprime o conteudo de linha directamente:

while (fgets(linha, sizeof linha, fp)) {
    printf("%s", linha); /* linha contem '\n' */
}

Se uma linha for maior que o espaço disponível, a vez seguinte que corre o ciclo vai buscar o resto da linha.


Outra maneira é fazeres o sscanf() mas aceitares espaços: o "%s" ignora espaços antes e depois das strings.

Para isso usa o "%79c" ou "%79[^\n]". Podes substituir o 79 por um asterisco e passar o valor para argumento

sscanf(linha, "%*c", sizeof valor - 1, valor);

Muito obrigado pela resposta da primeira forma funciona. Agora da segunda forma que referiste se eu usar o"%79c", quando o programa vai ler o ficheiro, nao funciona correctamente repetindo algumas partes . . .

Link to comment
Share on other sites

Agora da segunda forma que referiste se eu usar o"%79c", quando o programa vai ler o ficheiro, nao funciona correctamente repetindo algumas partes . . .

Oops ... erro meu, sorry.

O "%c" não termina as string correctamente, isto é, não escreve o '\0' no fim da string.

Mas o fgets() funciona e é, a meu ver, a função que melhor se adequa para ler linhas. O "%[]" e o "%c" eram mais como exemplos de outras formas que poderás ver em algum código.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Oops ... erro meu, sorry.

O "%c" não termina as string correctamente, isto é, não escreve o '\0' no fim da string.

Mas o fgets() funciona e é, a meu ver, a função que melhor se adequa para ler linhas. O "%[]" e o "%c" eram mais como exemplos de outras formas que poderás ver em algum código.

Ah . Ok . Então usando o fgets e sscanf não existe nenhuma maneira?

Link to comment
Share on other sites

Ah . Ok . Então usando o fgets e sscanf não existe nenhuma maneira?

Tens que especificar melhor o que pretendes.

Se pretendes ler e tratar linhas o fgets() é o melhor; se pretendes ler linhas e depois separá-las em palavras, fgets() seguido de sscanf("%*s") é uma boa hipótese; se pretendes ler linhas e depois separá-las em inteiros, fgets() seguido de strtol() é uma boa hipótese; ... ... se pretendes tratar a informação sem a noção de linhas, o fgets() provavelmente não deve ser uma boa escolha ...

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Tens que especificar melhor o que pretendes.

Se pretendes ler e tratar linhas o fgets() é o melhor; se pretendes ler linhas e depois separá-las em palavras, fgets() seguido de sscanf("%*s") é uma boa hipótese; se pretendes ler linhas e depois separá-las em inteiros, fgets() seguido de strtol() é uma boa hipótese; ... ... se pretendes tratar a informação sem a noção de linhas, o fgets() provavelmente não deve ser uma boa escolha ...

Apenas pretendo ler e tratar linhas.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.