Ir para o conteúdo
joaomb

Obter a maior palavra num ficheiro.

Mensagens Recomendadas

joaomb

ola, estou a começar ficheiros em c e queria um programa para me dar a maior palavra de um ficheiro, sendo que cada linha tem apenas uma palavra, isto e o que tenho ,mas por razoes que nao entendo nao funciona,

#include <stdio.h>
#include <stdlib.h>
#define MAX 25

void palavra_maior(FILE *fp)
{
char temp[MAX];
char maior[MAX];
rewind(fp);
fscanf(fp,"s",maior);
fgets(maior,MAX,fp);
while(fgets(temp,"%s",fp)!=NULL)
{
if(strlen(maior)<strlen(temp))
strcpy(maior,temp);

}

printf("A palavra maior e %s ",maior);
}

Editado por brunoais
tags code + geshi + título MUUUUITO melhorado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

tens imensos erros no teu código, mas existe algo que não percebo :

fscanf(fp,"s",maior);
//         |
//       que é isto ?

fgets(maior,MAX,fp);             // <--- olha para os argumentos da chamada da função fgets
while(fgets(temp,"%s",fp)!=NULL) // <--- olha para os argumentos da chamada da função fgets
}

podes explicar porque fizeste de maneira diferente ?

ainda por cima estão em linhas adjacentes !!

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaomb

sim sim tens razao, esta tinha sido uma versao mas depois enganei-me a postar, esta foi aquela com que fiquei no final,ja agora como e que meto o codigo a aparecer na caixa?:

#include <stdio.h>
#include <stdlib.h>
#define MAX 25

void palavra_maior(FILE *fp)
{
   char temp[MAX];
   char maior[MAX];
   rewind(fp);
   fgets(maior,MAX,fp);
   while(fgets(temp,MAX,fp)!=NULL)
   {
       if(strlen(maior)<strlen(temp))
           strcpy(maior,temp);
   }
   printf("A palavra maior e %s ",maior);
}

Editado por pmg
formatacao, GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

ê em voz alta o seguinte código (é o que tens no teu código)

if (strlen(maior) < strlen(temp))
   strcpy(maior, temp);


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o fgets lê toda uma linha até o '\n' (inclusivé) ou o tamanho maximo dado do buffer onde irá guardar os dados.

se tens o ficheiro mal formatado, então terás de o formatar bem, porque de outra forma terias de fazer linhas e linhas de código para colmatar todas as possibilidades de erro ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaomb

Para a próxima faz debug do programa ... corre linha a linha (usando step) e coloca na janela Watch a variável temp e maior ... assim detectas facilmente os teus erros. ;)

https://www.youtube.com/embed/eEJ5xKO7c3o?feature=oembed

sim eu costumo fazer o debug no codeblocks mas por exemplo na linha "fgets(maior,MAX,fp);" eu vejo que ele nao me copia o que existe na primeira linha ,so nao sei pq visto que ja vi varios exemplos assim...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

entao ja agora quais sao os erros???

não existe erros de código. os únicos problemas que te podem aparecer são :

- o ficheiro encontrasse vazio

- alguma linha do ficheiro tem mais do que 23 caracteres (tens de ter mais um para o '\n' final e outro para o '\0')


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaomb

jJA percebi o erro, estava a abrir com w em vez de w+, obrigado pelas dicas...


#include <stdio.h>
#include <stdlib.h>
#define MAX 25
void primario(void)
{

FILE *fp;
int i=0;
printf("Insira palavras\n");
char temp[MAX];
fp=fopen("palavras.txt","[b]w[/b]");/**w+*/
while(1)
{
	fgets(temp,MAX,stdin);
		if(strcmp(temp,"\n")==0)		/*se uma linha so tiver /n break*/
		   {
			   break;
		   }
	else
		{
		 fprintf(fp,"%s",temp);
		}
}

palavra_maior(fp);
fclose(fp);

}
/******	 funcao1	 ******/
void palavra_maior(FILE *fp)
{
char temp[MAX];
char maior[MAX];
rewind(fp);
  fgets(maior,MAX,fp);
  while(fgets(temp,MAX,fp)!=NULL)
  {
if(strlen(maior)<strlen(temp))
	strcpy(maior,temp);

  }

printf("A palavra maior e %s ",maior);
}

Editado por joaomb

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

epa ... tens o código correcto acima e agora apresentas um código cheio de erros e problemas ???


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
joaomb

epa ... tens o código correcto acima e agora apresentas um código cheio de erros e problemas ???

foi como tinha dito tinha-me enganado a versao que tinha apresentado a 1 vez tava cheia de erros pq foi a primeira que escrevi e ainda nao sabia trabalhar bem com as funcoes

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

sim ja vi e ja corrigi obrg, mas olha que ela correu mesmo estando errada e dava certo

experimenta auemtnar o nível de erros do compilar e enfiar um -Werror e terias visto que nem sequer compilava ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Se meteres gasoleo num carro a gasolina, ele anda ... mas isso não quer dizer que esteja certo!


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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruirodrigues1971

mode
C string containing a file access mode. It can be:
"r" read: Open file for input operations. The file must exist.
"w" write: Create an empty file for output operations. If a file with the same name already exists, its contents are discarded and the file is treated as a new empty file.
"a" append: Open file for output at the end of a file. Output operations always write data at the end of the file, expanding it. Repositioning operations (fseek, fsetpos, rewind) are ignored. The file is created if it does not exist.
"r+" read/update: Open a file for update (both for input and output). The file must exist.
"w+" write/update: Create an empty file and open it for update (both for input and output). If a file with the same name already exists its contents are discarded and the file is treated as a new empty file.
"a+" append/update: Open a file for update (both for input and output) with all output operations writing data at the end of the file. Repositioning operations (fseek, fsetpos, rewind) affects the next input operations, but output operations move the position back to the end of file. The file is created if it does not exist.

Aconselho-te a ler

http://www.cplusplus.com/reference/cstdio/fopen/?kw=fopen

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.