View Full Version : [AJUDA] ficheiros em c


Nody
12-03-2008, 22:39
pessoal tenho 1 problema da escola para entregar na sexta muito simples mas não sei por onde lhe ei de pegar. é o seguinte:

Ler a primeira linha de um ficheiro .txt onde está escrito o nome completo de uma pessoa.
a)Contar o número de caracteres e o número de palavras.
b)Ler apena a primeira letra de cada nome e criar uma sigla.

PS:os espaços não contam.

Alguem manda umas ideias po ar?

Cumps

Baderous
12-03-2008, 22:43
fopen para abrir o ficheiro e lês a 1ª linha para uma string com o fgets. A partir daí é trabalhar sobre essa string.

Nody
12-03-2008, 22:44
fopen para abrir o ficheiro e lês a 1ª linha para uma string com o fgets. A partir daí é trabalhar sobre essa string.

e em relação às palavras? como conto cada palavra? como excluo os espaços? e se o nome tiver espaços antes? :S o meu problema tá aí...

Cumps

mrjm
12-03-2008, 22:45
Olá,

Primeiro tens de abrir o fixeiro .txt em modo de leitura, já que não o vais editar

Segundo podes fazer um menu em que a opção 1 será contar o numero de caracteres e para isso tens de criar um ciclo for em que ele apague os espaços, de modo a ficar tudo seguido (i.e JOAO MENDES, ficava JOAOMENDES) e assim fazes a contagem. Depois podes por na segunda opcção do menu "criar sigla" e crias outro ciclo em que ele examina a primeira letra e copia para uma variavel e depois do espaço ve a outra letra e adiciona a outra variavel auxiliar.... depois e so fazeres um printf das variaveis... =) gostas de ideia?

Nody
12-03-2008, 22:48
Olá,

Primeiro tens de abrir o fixeiro .txt em modo de leitura, já que não o vais editar

Segundo podes fazer um menu em que a opção 1 será contar o numero de caracteres e para isso tens de criar um ciclo for em que ele apague os espaços, de modo a ficar tudo seguido (i.e JOAO MENDES, ficava JOAOMENDES) e assim fazes a contagem. Depois podes por na segunda opcção do menu "criar sigla" e crias outro ciclo em que ele examina a primeira letra e copia para uma variavel e depois do espaço ve a outra letra e adiciona a outra variavel auxiliar.... depois e so fazeres um printf das variaveis... =) gostas de ideia?

gosto da ideia, parece-me simples e eficaz, para me elucidar um pouco + poderias-me dar um exemplo em código de como ler apenas a primeira letra de uma palavra? senão for incomodar agradecia :)

Cumps

Baderous
12-03-2008, 23:01
e em relação às palavras? como conto cada palavra? como excluo os espaços? e se o nome tiver espaços antes? :S o meu problema tá aí...

Cumps

Começas a analisar a string e, enquanto o 1º caracter for espaço, vais avançando e ignorando.
Depois, quando já tiveres encontrado o 1º caracter não espaço, para contar as palavras crias um ciclo em que vais percorrendo a string e sempre que encontrares um espaço, incrementas um contador (pois sempre que há um espaço é uma palavra nova). No fim retornas esse contador incrementado de uma unidade (pois por este método, como a seguir ao último nome não tem espaço mas existe palavra, tens de contar também).

Nody
13-03-2008, 21:28
Podias trocar isso um pouco + por míudos?

Abraço.

Baderous
14-03-2008, 16:19
#include <stdio.h>
#include <ctype.h> //necessária para a função isalpha

int main() {
int c=0,i,j,k;
char nome[100];
FILE *fp;
fp = fopen("file.txt","r");
while (fgets(nome,sizeof(nome),fp)!= NULL) {
for (i=0;nome==' ';i++); //Ignora qualquer espaço inicial na string, logo não interessa se o nome tem espaços antes da 1ª palava
for (j=strlen(nome);!isalpha(nome[j]);j--)
nome[j]='\0'; //Elimina os espaços existentes no fim da última palavra do nome
for (k=i;nome[k]!='\0';k++)
if (nome[k]==' ')
c++; //Vai contando os espaços que existem entre as palavras do nome

}
printf("Numero de palavras: %d\n",c+1); //+1 para contar com a última palavra
fclose(fp);
return 0;
}Vou deixar aqui um exemplo para perceberes melhor como funciona cada passo:


Vou utilizar a notação <espaço> para identificar os espaços
nome real: Jose Carlos Leite
nome, com indicação dos espaços entre as palavras e também os espaços possíveis antes da 1ª palavra e depois da última: <espaço>Jose<espaço>Carlos<espaço>Leite<espaço><espaço>
Após o 1º for: Jose<espaço>Carlos<espaço>Leite<espaço><espaço>
Após o 2º for: Jose<espaço>Carlos<espaço>Leite
Nesta altura já só tens os espaços entre as palavras. Neste exemplo, o nome tem 3 palavras e existem 2 espaços, logo no 3º [I]for vamos contar os espaços (2) e no fim, no printf, adicionamos uma unidade ao contador para que ele conte a última palavra.Está um bocado à bruta mas é o melhor que se arranja.

Nody
17-03-2008, 09:48
mil obrigados :)