Jump to content

Problema em Manipulação de Ficheiro


Psycop
 Share

Recommended Posts

Boas

Estou com algumas dificuldades na manipulação e tratamento de um ficheiro.

O ficheiro tem esta estrutura:

10-06-2012 22:09:07 A Temperatura é de: 21.08

10-06-2012 22:09:07 A Temperatura é de: 21.57

10-06-2012 22:09:08 A Temperatura é de: 21.08

10-06-2012 22:09:08 A Temperatura é de: 21.08

10-06-2012 22:09:08 A Temperatura é de: 21.08

10-06-2012 22:09:08 A Temperatura é de: 21.08

10-06-2012 22:09:08 A Temperatura é de: 21.08

10-06-2012 22:09:08 A Temperatura é de: 21.08

O código que criei é o seguinte:

#include <stdio.h>
#include <stdlib.h>
#define N 100
float temperatura[N];
int dia[N], mes[N], ano[N], hora[N], minuto[N], segundo[N];
int num_linhas = 0;
void lerficheiro()
{
   FILE *entrada;
   int i;
   entrada = fopen("log.txt","r");
   if(entrada==NULL)
   {
       printf("Erro na abertura do ficheiro de entrada\n");
       system("pause");
   }
   else
   {
       while(fscanf(entrada, "%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", &dia[i], &mes[i], &ano[i], &hora[i], &minuto[i], &segundo[i], &temperatura[i]) != EOF)
       {
           printf("%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", dia[i], mes[i], ano[i], hora[i], minuto[i], segundo[i], temperatura[i]);
           num_linhas = num_linhas + 1;
           i++;
       }
       printf("\n\n");
       printf("Numero de Linhas = %d\n", num_linhas);
   }
}

int main()
{
   int escolha;
   printf("\t\t\t\t***MENU***");
   printf("\n\n");
   printf("1 - Ler Ficheiro de Dados:\n");
   printf("2 - Calcular a Média das Temperaturas:\n");
   printf("3 - Verificar Temperatura Maxima:\n");
   printf("4 - Verificar Temperatura Minima:\n");
   printf("5 - SAIR\n");
   printf("\n");
   printf("Opcao:");
   scanf("%d", &escolha);

   switch(escolha)
   {
       case 1:
       {
           printf("\n\n1- Escolheu Ler o Ficheiro de Dados:\n\n");
           lerficheiro();
           break;
       }
       case 2:
       {
           printf("\n\n2 - Escolheu Calcular a Media das Temperaturas:\n\n");
           lerficheiro();
           float soma_temp = 0, temp_media = 0;
           int j;
           for(j = 0; j < num_linhas; j++)
           {
               soma_temp = soma_temp + temperatura[j];
           }
           temp_media = soma_temp / num_linhas;
           printf("Media = %f", temp_media);
           break;
       }
       case 3:
       {
           float temp_max = 0;
           int j;
           lerficheiro();
           printf("\n\n3 - Verificar Temperatura Maxima:\n\n");
           for(j = 0; j < num_linhas; j++)
           {
               if (temperatura[j] > temp_max)
               {
                   temp_max = temperatura[j];
               }
           }
           printf("Temperatura Maxima = %f", temp_max);
           break;
       }
       case 4:
       {
           float temp_min;
           int j;
           lerficheiro();
           printf("\n\n4 - Verificar Temperatura Minima:\n\n");
           for(j = 0; j < num_linhas; j++)
           {
               temp_min = temperatura[0];

               if (temperatura[j] < temp_min)
               {
                   temp_min = temperatura[j];
               }
           }
           printf("Temperatura Minima = %f", temp_min);
           break;
       }
       case 5:
       {
           printf("Escolheu SAIR:");
           exit(0);
       }
   }while(escolha != 5);
}

O que acontece é que nem a média, nem a tem_min é dada correctamente, ao passo que a temp_max é correcta.

A média dá um valor parvo e estou com dúvidas que estejam a ser somados todos os valores de modo a serem divididos pelo nu,_linhas, na temp_min dá zero.

Alguém consegue ver onde está o problema?

Cumps

Edited by pmg
LP adicionada ao GeSHi
Link to comment
Share on other sites

  • Replies 47
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Tens alguns problemas no codigo!

o teu while nao esta' a fazer literalmente nada!!!!!!! falta.te o do{ - ate fica a entrar num ciclo infinito!!!

tens que por o num_de_linhas a zero sempre que fores a ler o ficheiro!

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

o teu while nao esta' a fazer literalmente nada!!!!!!! falta.te o do{ - ate fica a entrar num ciclo infinito!!!

Estás a pensar noutra linguagem: em C tanto existe a forma :

while (condicao)
{
 /* Só executa se condição verdadeira */
}

como a forma :

do {
 /* Executa pelo menos uma vez, repete se condição verdadeira */
while (condicao);

O ciclo dele está correcto. Quanto ao código :

1) Não precisas das duas variáveis 'i' e 'num_linhas' na funcão 'lerficheiro'; basta a segunda pois são manipuladas da mesma maneira.

2) Quando alterares isso vais reparar que não estás a inicializar a 'i', que começa com um valor qualquer (provavelmente indexando fora dos array) e por isso não tens valores válidos nos arrays.

3) Não uses uma variável global para o número de linhas carregadas; usa o valor de retorno da função.

4) No cálculo da temperatura mínima tens de inicializar a 'temp_min' com um valor que garantidamente seja maior que todos os que podem ser recebidos; como está não funciona.

Link to comment
Share on other sites

Estás a pensar noutra linguagem: em C tanto existe a forma :

while (condicao)
{
 /* Só executa se condição verdadeira */
}

como a forma :

do {
 /* Executa pelo menos uma vez, repete se condição verdadeira */
while (condicao);

O ciclo dele está correcto.

As minhas sinceras desculpas, por vezes ate' me engano a confundir com C++.

Ora la' conta as chavetas e ve se encontras la:

o teu while nao esta' a fazer literalmente nada!!!!!!! falta.te o do{ - ate fica a entrar num ciclo infinito!!!

Pelo o que eu sei esta condicao e' sempre falsa a menos que queiras sair!

while(escolha != 5);

Em cima falta um do!!!

para veres mesmo onde esta' o erro, vou meter mais explicito:

  switch(escolha)
{
//....
}while(escolha != 5);

Nao esta errado, mas entra num ciclo infinito.

tou a ver qe tenho que comecar a dizer a linha, e mostrar o codigo e ate' resolver o problema todo e postar o codigo... -.-'

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

for(j = 0; j < num_linhas; j++)
{
			temp_min = temperatura[0];
			if (temperatura[j] < temp_min)
			{
				temp_min = temperatura[j];
			}
}

A cada iteração do ciclo voltas a colocar o valor da temperatura mínima com o valor da primeira posição do array. Passa essa inicialização para fora do ciclo for.

Edited by Flinger
Link to comment
Share on other sites

while(escolha != 5);

Em cima falta um do!!!

para veres mesmo onde esta' o erro, vou meter mais explicito:

  switch(escolha)
{
//....
}while(escolha != 5);

Nao esta errado, mas entra num ciclo infinito.

tou a ver qe tenho que comecar a dizer a linha, e mostrar o codigo e ate' resolver o problema todo e postar o codigo... -.-'

O ciclo a que me referi foi o primeiro, dentro da lerficheiro; nem sequer reparei nesse pois as queixas dele não têm nada a ver com isso. Portanto tens razão que esse ciclo não está a fazer nada.

E sim, é conveniente meter algum contexto nas respostas para que se perceba claramente do que se escreve.

Link to comment
Share on other sites

O ciclo a que me referi foi o primeiro, dentro da lerficheiro; nem sequer reparei nesse pois as queixas dele não têm nada a ver com isso. Portanto tens razão que esse ciclo não está a fazer nada.

E sim, é conveniente meter algum contexto nas respostas para que se perceba claramente do que se escreve.

E' claro que e' suposto o ultimo ciclo dele ser um do{}while(...), pode nao ser o que user se queixa, mas esta' claramente errado, entra num ciclo infinito apos a primeira escolha, penso que o maior erro esta' ai.

O outro concelho que lhe dei penso que foi claro o suficiente!

tens que por o num_de_linhas a zero sempre que fores a ler o ficheiro!

Se escolheres a opcao 1 e depois a 2, os valores serao completamente errados porque o num_de_linhas sera' 2 vezes maior que o numero de linhas do ficheiro.

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

E' claro que e' suposto o ultimo ciclo dele ser um do{}while(...), pode nao ser o que user se queixa, mas esta' claramente errado, entra num ciclo infinito apos a primeira escolha, penso que o maior erro esta' ai.

Provavelmente o OP nem se apercebeu do efeito dessa linha, pois o que faz é não deixar terminar o programa se a opção escolhida não fôr a 5. Isso provavelmente tem a consequência de manter a janela de execução aberta para permitir ver o resultado da operação escolhida; se não fosse essa linha ele teria de meter um getch() ou um system("pause") ou outra coisa semelhante ou estaria aqui a queixar-se de não conseguir ver o resultado. Isto é um pormenor.

O outro concelho que lhe dei penso que foi claro o suficiente!

Se escolheres a opcao 1 e depois a 2, os valores serao completamente errados porque o num_de_linhas sera' 2 vezes maior que o numero de linhas do ficheiro.

Tens razão nisso mas esse não é o principal problema pois como dizes apenas se manifesta na segunda execução da lerficheiro, o que não é problema aqui pois com este código isso nunca pode acontecer. O verdadeiro problema é que os valores são lidos para posições indexadas pela variável 'i', que nunca é inicializada. Este é o principal erro.

Link to comment
Share on other sites

Bom dia!

Estive a tentar implementar a função ler_ficheiro mais correctamente passando todos os valores como apontadores, mas não estou a conseguir! Confesso que não percebo grande coisa de funções, podiam dizer-me o que estou a fazer mal e o porquê?

O código é o seguinte:

#include <stdio.h>
#include <stdlib.h>
#define N 1000
void ler_ficheiro(int *num_linhas, int *ano[N], int *mes[N], int *dia[N], int *hora[N], int *min[N], int *seg[N], float[N] *temperatura[N])
{
   FILE *entrada;
   entrada = fopen("log.txt", "r");
   if (entrada == NULL)
   {
    printf("Erro na Abertura do Ficheiro de Entrada:\n\n");
    system("PAUSE");
   }
   else
   {
    while (!feof(entrada))
    {
	    fscanf(entrada, "%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", &dia[i], &mes[i], &ano[i], &hora[i], &min[i], &seg[i], &temperatura[i]);
	    printf("%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", dia[i], mes[i], ano[i], hora[i], min[i], seg[i], temperatura[i]);
	    num_linhas = num_linhas + 1;
	    i++;
    }
    printf("\n\n");
    printf("Numero de Linhas = %d\n\n", num_linhas);
   }

}
int main()
{
   ler_ficheiro(int *num_linhas, int *ano[N], int *mes[N], int *dia[N], int *hora[N], int *min[N], int *seg[N], float[N] *temperatura[N]);
}

Cumps

Link to comment
Share on other sites

Bom dia!

Estive a tentar implementar a função ler_ficheiro mais correctamente passando todos os valores como apontadores, mas não estou a conseguir! Confesso que não percebo grande coisa de funções, podiam dizer-me o que estou a fazer mal e o porquê?

O código é o seguinte:

#include <stdio.h>
#include <stdlib.h>
#define N 1000
void ler_ficheiro(int *num_linhas, int *ano[N], int *mes[N], int *dia[N], int *hora[N], int *min[N], int *seg[N], float[N] *temperatura[N])
{
FILE *entrada;
entrada = fopen("log.txt", "r");
if (entrada == NULL)
{
	printf("Erro na Abertura do Ficheiro de Entrada:\n\n");
	system("PAUSE");
}
else
{
	while (!feof(entrada))
	{
		fscanf(entrada, "%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", &dia[i], &mes[i], &ano[i], &hora[i], &min[i], &seg[i], &temperatura[i]);
		printf("%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", dia[i], mes[i], ano[i], hora[i], min[i], seg[i], temperatura[i]);
		num_linhas = num_linhas + 1;
		i++;
	}
	printf("\n\n");
	printf("Numero de Linhas = %d\n\n", num_linhas);
}

}
int main()
{
ler_ficheiro(int *num_linhas, int *ano[N], int *mes[N], int *dia[N], int *hora[N], int *min[N], int *seg[N], float[N] *temperatura[N]);
}

Cumps

Em que sitio do teu codigo tens declarada a variavel i?

Link to comment
Share on other sites

int main()
{
    ler_ficheiro(int *num_linhas, int *ano[N], int *mes[N], int *dia[N], int *hora[N], int *min[N], int *seg[N], float[N] *temperatura[N]);
}

Além do que disse o mundo, a chamada na função está completamente errada.

O protótipo da função também... presumo que queiras passar arrays de ints. para isso basta declarar que a tua função recebe um int *. No caso do float, um float *.

Além disso, precisas criar na main as variáveis que vais passar à tua função.

Por exemplo:

void calcula(int *a)
{
   int i=0;
   for (i=0;i<10;i++)
	 a[i]=i;
}
int main()
{
 int a[10];
 int j=0;
 calcula(a);
 for (j=0;j<0;j++)
   printf("%d\n",a[j]);
 return 0;
}
Link to comment
Share on other sites

Boa Tarde

Estou novamente com problemas na criação da função para ler os dados de um ficheiro.

O código que criei até agora é o seguinte:

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

#define N 1000
void ler_ficheiro(int *num_linhas, int *ano, int *mes, int *dia, int *hora, int *min, int *seg, float *temperatura)
{
FILE *entrada;
int i;

entrada = fopen("log.txt", "r");
if (entrada == NULL)
{
	printf("Erro na Abertura do Ficheiro de Entrada:\n\n");
	system("PAUSE");
}
else
{
	while (!feof(entrada))
	{
		fscanf(entrada, "%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", &dia[i], &mes[i], &ano[i], &hora[i], &min[i], &seg[i], &temperatura[i]);
		printf("%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", dia[i], mes[i], ano[i], hora[i], min[i], seg[i], temperatura[i]);

		num_linhas = num_linhas + 1;
		i++;
	}

	printf("\n\n");
	printf("Numero de Linhas = %d\n\n", num_linhas);
}

}

int main()
{
int i;
int dia[N], mes[N], ano[N], hora[N], min[N], seg[N];
float temperatura[N];

ler_ficheiro(dia, mes, ano, hora, min, seg, temperatura);
}

Alguém me poderia explicar onde é que estou a errar e porquê?

Cumps

Edited by Psycop
Link to comment
Share on other sites

Estás sempre a fazer o mesmo erro; estás a ler as respostas fornecidas ?

Variáveis declaradas no interior de funções que não sejam declaradas como estáticas não são inicializadas a valor nenhum. Estás sempre a declarar a variável 'i' mas nunca a inicializas (deveria ser inicializada a zero).

Link to comment
Share on other sites

Olá

Os erros de compilação são os seguintes:

tica\LM335A\V_1.03\main.c||In function 'main':|

tica\LM335A\V_1.03\main.c|39|warning: passing argument 7 of 'ler_ficheiro' from incompatible pointer type|

tica\LM335A\V_1.03\main.c|5|note: expected 'int *' but argument is of type 'float *'|

tica\LM335A\V_1.03\main.c|39|error: too few arguments to function 'ler_ficheiro'|

||=== Build finished: 1 errors, 1 warnings ===|

Estes erros de compilação surgem mesmo após inicializar as variáveis i = 0;

Mas pelos exemplos que vejo na internet não vejo nada de estranho! Qual o erro que estou a cometer?

EDIT: Já verifiquei que estava a passar um argumento a menos para a função, e era daí o erro assim como o num_linhas na função.

Cumps

Edited by Psycop
Link to comment
Share on other sites

Repara nos parametros que a funçao recebe

void ler_ficheiro(int *num_linhas, int *ano[N], int *mes[N], int *dia[N], int *hora[N], int *min[N], int *seg[N], float[N] *temperatura[N])

Falta-te passar na main o &num_linhas.

Nao tinha visto, mas em dia, etc tens que passar o endereço tambem.

Edited by mundo
Link to comment
Share on other sites

Bom Dia

Acabei por conseguir colocar tudo a funcionar da seguinte forma, no entanto não sei se foi a mais correcta.

Aqui fica o código:

#include <stdio.h>
#include <stdlib.h>
#define N 1000

int ler_ficheiro(int *dia, int *mes, int *ano, int *hora, int *min, int *seg, float *temperatura)
{
       FILE *entrada;
       int i = 0;
       int num_linhas = 0;
       entrada = fopen("log.txt", "r");
       if (entrada == NULL)
       {
               printf("Erro na Abertura do Ficheiro de Entrada:\n\n");
               system("PAUSE");
       }
       else
       {
               while (!feof(entrada))
               {
                       fscanf(entrada, "%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", &dia[i], &mes[i], &ano[i], &hora[i], &min[i], &seg[i], &temperatura[i]);
                       printf("%d-%d-%d %d:%d:%d A Temperatura é de: %f\n", dia[i], mes[i], ano[i], hora[i], min[i], seg[i], temperatura[i]);
                       i++;
               }
               return i;
       }
}
int media_temp(int *dia, int *mes, int *ano, int *hora, int *min, int *seg, float *temperatura)
{
   float soma_temp = 0, temp_media = 0;
   int j, num_linhas = 0;
   num_linhas = ler_ficheiro(dia, mes, ano, hora, min, seg, temperatura);
   for(j = 0; j < num_linhas; j++)
   {
       soma_temp = soma_temp + temperatura[j];
       temp_media = soma_temp / num_linhas;
   }
   printf("Media = %f", temp_media);
}
float temp_max(int *dia, int *mes, int *ano, int *hora, int *min, int *seg, float *temperatura)
{
   float temp_max = 0;
   int j, num_linhas = 0;
   num_linhas = ler_ficheiro(dia, mes, ano, hora, min, seg, temperatura);
   for(j = 0; j < num_linhas; j++)
   {
       if (temperatura[j] > temp_max)
       {
           temp_max = temperatura[j];
       }
   }
   printf("Temperatura Maxima = %f", temp_max);
}
float temp_min(int *dia, int *mes, int *ano, int *hora, int *min, int *seg, float *temperatura)
{
   float temp_min;
   int j,num_linhas = 0;
   num_linhas = ler_ficheiro(dia, mes, ano, hora, min, seg, temperatura);
   for(j = 0; j < num_linhas; j++)
   {
       temp_min = temperatura[0];
       if (temperatura[j] < temp_min)
       {
           temp_min = temperatura[j];
       }
   }
   printf("Temperatura Maxima = %f", temp_min);
}

int main()
{
       int dia[N], mes[N], ano[N], hora[N], min[N], seg[N];
       float temperatura[N];
       int num_linhas;
       int escolha;
       do
       {
           printf("                ***MENU***");
           printf("\n\n");
           printf("1 - Ler Ficheiro de Dados:\n");
           printf("2 - Calcular a Média das Temperaturas:\n");
           printf("3 - Verificar Temperatura Maxima:\n");
           printf("4 - Verificar Temperatura Minima:\n");
           printf("5 - SAIR\n");
           printf("\n");
           printf("Opcao:");
           scanf("%d", &escolha);
           switch(escolha)
           {
               case 1:
               {
                   printf("\n\n1- Escolheu Ler o Ficheiro de Dados:\n\n");
                   ler_ficheiro(dia, mes, ano, hora, min, seg, temperatura);
                   num_linhas = ler_ficheiro(dia, mes, ano, hora, min, seg, temperatura);
                   printf("Num Linhas = %d", num_linhas);
                   printf("\n\n\n");
                   break;
               }
               case 2:
               {
                   printf("\n\n2 - Escolheu Calcular a Media das Temperaturas:\n\n");
                   media_temp(dia, mes, ano, hora, min, seg, temperatura);
                   break;
               }
               case 3:
               {
                   printf("\n\n3 - Verificar Temperatura Maxima:\n\n");
                   temp_max(dia, mes, ano, hora, min, seg, temperatura);
                   break;
               }
               case 4:
               {
                   printf("\n\n3 - Verificar Temperatura Minima:\n\n");
                   temp_min(dia, mes, ano, hora, min, seg, temperatura);
                   break;
               }
               case 5:
               {
                   printf("Escolheu SAIR:");
                   exit(0);
               }
               default:
               {
                   printf("\n\n Opção Errada:");
                   return main();
               }
           }
       }while(escolha != 5);
}

Cumps

Edited by pmg
LP adicionada ao GeSHi
Link to comment
Share on other sites

claro que tenho algumas coisas a dizer 😄

1º - que retorna a função ler_ficheiro caso falhe a abertura do ficheiro ?

2º - caso o ficheiro tenha 900 entradas, vou ter de as ver a aparecer no ecrã durante a leitura do ficheiro ???

3º - porque não usas estruturas para guardar a informação de uma entrada do ficheiro ? dessa maneira só necessitas de um único array

4º - porque raio estás a ler o ficheiro sempre que se escolhe uma opção ? não basta ler no início da aplicação ? novamente de tiver 900 entradas, lá vão elas aparecer ...

5º - usas muito esporadicamente o "\n" .. o teu output deve ser uma salgalhada

6º - ao usar o scanf sem limpeza do buffer de leitura e validação de entrada, isso é mais do que meio caminho para conseguir estoirar o programa ao carregar nas teclas erradas

7º - apesar de todas as tuas funções estarem definidas para retornar alguma coisa não existe nenhum return final na maior parte delas

8º - de certeza que tens warnings na tua compilação, corrige-os antes de mais nada

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Boas

Bem, essas questões também me levantam algumas dúvidas....

1º - Como poderia retornar esse resultado, uma vez que já retorno o valor do num_linhas? Teria de ser através do apontador? Não é possível só retornar um valor por referência para fora da função?

2º - Esses são pormenores a corrigir nas próximas versões da aplicação, só quis ter tudo a correr minimamente.

3º - Já tinha pensado nessa solução, mas qual é a vantagem real de usar as estruturas neste caso? A melhor organização?

4º - Leio sempre a função ler_ficheiro sempre devido a ter de retornar o valor do num_linhas em cada opção... Mas talvez isto nem faça grande sentido.

5º - Quanto aos "\n" será mais um ponto para organizar.

6º - Não me lembrava dessa situação, devo então usar o fflush(stdin) não é?

7º - Pois as funções estão quase a funcionar como procedimentos não é?

8º - Na compilação não me dá nenhum warning. Uso o Codeblocks com o GCC pré-definido.

Cumps

Link to comment
Share on other sites

1º - Como poderia retornar esse resultado, uma vez que já retorno o valor do num_linhas? Teria de ser através do apontador? Não é possível só retornar um valor por referência para fora da função?

ao retornar um número sem sentido estás a dizer que algo aconteceu mal, por exemplo -1. não faz sentido existirem -1 linhas

2º - Esses são pormenores a corrigir nas próximas versões da aplicação, só quis ter tudo a correr minimamente.

como queiras, se fosse eu é que seria mesmo muito chato estas a aparecer as linhas todas sempre que escolho uma opção ...

3º - Já tinha pensado nessa solução, mas qual é a vantagem real de usar as estruturas neste caso? A melhor organização?

o código mais bem organizado, mais coerente, mais fácil de ler e existe melhorias de performance em leitura de dados de um registo porque os dados de um registo estão localmente próximos ao contrário de um conjunto de arrays

4º - Leio sempre a função ler_ficheiro sempre devido a ter de retornar o valor do num_linhas em cada opção... Mas talvez isto nem faça grande sentido.

se a função ler_ficheiro retorna o número de linhas, essa informação já se encontra no main passível de ser fornecida a cada função. logo sim, não faz sentido a abertura/leitura/fecho do ficheiro sempre que se escolhe uma opção

5º - Quanto aos "\n" será mais um ponto para organizar.

sim. mas mais vale cedo do que depois de o código começar a ficar grande

6º - Não me lembrava dessa situação, devo então usar o fflush(stdin) não é?

não se faz fflush do stdin, porque se bem me lembro, isso até nem faz nada. deverás tentar implementar um método de leitura válido.

isso pode passar por forçar a descartar através de elementos extra no próprio scanf, exemplo:

scanf("%d[^\n]\n", &i); // leitura de um inteiro descartando o restante até ao carater '\n' e o próprio

ou a conbiinação fgets/sscanf, exemplo:

char buffer[256]; // um tamanho suficiente
fgets(buffer, 256, stdin); // leitura do stdin para o array de caracteres, o caracter '\n' também é lido e colocado no buffer
sscanf(buffer, "%d", &i); // leitura de um inteiro do buffer

no final deverá ser sempre validado o número de elementos lidos do scanf/sscanf, exemplo

if (scanf("%d %d[^\n]\n", &i1, &i2) != 2) {
 // o número de elementos lidos não é igual aos dois esperados
}

7º - Pois as funções estão quase a funcionar como procedimentos não é?

se não queres retornar nada, indica que tal com o uso do "void"

8º - Na compilação não me dá nenhum warning. Uso o Codeblocks com o GCC pré-definido.

se não te dá é porque o compilador está caladinho. tens de aumentar o nível de warnings. no codeblocks não sei porque não uso mas deves conseguir encontrar na net como se faz (se até lá ninguém o disser aqui)

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

não se faz fflush do stdin, porque se bem me lembro, isso até nem faz nada.

O problema do fflush(stdin) é que o padrao da linguagem nao define o que acontece nessa situacao: ou seja, as implementacoes podem definir o que bem entenderem, desde que documentem o comportamento. Ao usar essa construcao (como nem todas as implementacoes a definem da mesma maneira), estas a limitar, conscientemente e de boa vonrade, o teu codigo a correr apenas na implementacao que faz o que esperas que a construcao faca.

Por exemplo: em POSIX o comportamento esta definido como posicionando o apontador do ficheiro para imediatamente a seguir ao ultimo byte lido (ou seja, nao faz nada); em Windows esta definido como limpando o conteudo do buffer associado ao stream (o que quer que seja que isso quer dizer). Em ambos os casos esta assinalado (na documentacao do Windows essa sinalizacao esta bem escondida) que a construcao e uma extensao ao C padrao.

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

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.