Jump to content

Importar arquivo externo


vitor monteiro
 Share

Recommended Posts

vitor monteiro

Boas pessoal precisava ajuda neste trabalho que e basicamente um programa de gestao de alunos que possibilite a inportaçao dos nomes a partir de um ficheiro externo, e as notas de três testes tambem a partir de ficheiros externos, tudo em arrays o problema é que tou a tentar importar mas iste codigo nao ta a importar os valores depois da virgula ou ponto.

As notas teem que ser float e ter duas casas decimais.

Não sei se da forma que eu tou a fazer é a melhor

void fpfile2(){
   FILE *fp;
   char s[100] = ("f:\\tir\\1test.txt"), ch;
   float valor[nnomes][5];
   int i, j, total, num, multiplicador ;

   for(i=0; i<nnomes; i++){
       test[i]=0;
       for(j=0; j<5; j++){
           valor[i][j] = '\0';
       }
   }

       if((fp = fopen(s,"r")) == NULL) { printf("\n Impossível abrir o Arquivo."); }

       else{

       i = 0; j = 0;
       while( (ch = fgetc(fp)) != EOF ){

           if(ch != '\n')  {valor[i][j] = ch; j++;}
           else { i++; j = 0; }

            //printf("%c",ch);
       }
       fclose(fp);
   }

   for(i=0; i<quantidadenomes(); i++){
       multiplicador = 1;
       for(j=2; j>=0; j--){
           if( (float)valor[i][j] < 48 || (float)valor[i][j] > 57 ){ //quando detecta letras
           }else{
               num = 0; total = 0;
               num = (float)valor[i][j] - 48;
               //printf("TESTE -...%d...i=%d...j=%d\n", num, i, j);
               num = num * multiplicador; 
               total = total + num;
               multiplicador = multiplicador * 10;
               test[i]+= total;
           }
       }
   }
   for(i=0; i<quantidadenomes(); i++){
       printf("%.2f\n", test[i]);
   }

}
Edited by thoga31
GeSHi
Link to comment
Share on other sites

HappyHippyHippo

antes sequer de olhar para o código:

- volta a escrever a descrição do problema, agora coerentemente, e de preferência pontuado

- apresenta a formatação dos ficheiros de dados, isto é, pelo menos, algumas linhas de exemplo de cada um

ps : esquece o atoi, em toda a mnha vida de programador, nunca vi a necessidade dessa função

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

vitor monteiro

O senhor ta a referir ao resultado que aparece depois de importar pelo ficheiro txt ou o como esta escrito no feixeiro txt?

peço desculpa ainda sou muito novo neste tipo de coisas

Edited by vitor monteiro
Link to comment
Share on other sites

vitor monteiro

ta escrito directo tipo eu podia fazer um codigo que podia ler so um ficheiro com tudo mas isso iria fazer com que eu ficasse mais careca ainda XD

188,20

88

12

44.60

55.90

Edited by vitor monteiro
Link to comment
Share on other sites

vitor monteiro

isso e o que eu tenho no freixeiro txt mas quando utilizo o codigo eles sao apresentados assim no array

ja nado prints para o senhor ver

188,00

88,00

12,00

44,00

55,00

Edited by vitor monteiro
Link to comment
Share on other sites

HappyHippyHippo

vamos lá ver uma coisa.

queres um código para ler um inteiro do ficheiro, ok :

fscanf(fp, "%d", &variavel);

como, fizeste o favor de não explicar o que queres fazer de forma clara, mesmo após de várias tentativas de fazer que o explicasses, mais informação é impossível apresentar.

por outras palavras : se apresentas pouca informação, pouca informação é a que recebes.

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

vitor monteiro

eu queria que les se como esta no txt os numeros teem que ser float

que mais informaçao e que o senhor deseja?

Edited by vitor monteiro
Link to comment
Share on other sites

ps : esquece o atoi, em toda a mnha vida de programador, nunca vi a necessidade dessa função

Viva, importas-te de elaborar acerca da inutilidade do atoi() e que usas para converter ascii para integer?

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

HappyHippyHippo

Viva, importas-te de elaborar acerca da inutilidade do atoi() e que usas para converter ascii para integer?

sscanf(ascii_number, "%d", &byte_number); // <-- facilidade de verificação de erro através do retorno da função
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Ahhh, ok... depende da plataforma suponho... Para microcontroladores, etc... Usar printf/scanf, etc.. É proibitivo, daí a questão.

Obrigado pelo esclarecimento.

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

vitor monteiro

Boas ver se o senhor me conseguiria ajudar num problema outra vez

Tenho uma Funçao que serve para Fazer printfs de nomes guardados num Array Bidimensional

Que tem dois defines

nnomes 500

nnletras 100

E nessa Funçao Esta o seguinte

void imprimirnome(int linha){
   int i;
   for(i=0; i<nletras; i++){
    if(nome[linha][i]!='\0'){
	    printf(GREEN"%c"LIMPAR,nome[linha][i]);
    }
   }   
}

o que significa que só precisa de invocar o nome da funçao dentro de um for do tipo

for(i=0; i<quantidadenomes(); i++){
	    if(nome[i][0]=='\0'){ break; }
	    printf("\n %3d: ",i+1);
	    imprimirnome(i);
    }

Mas neste codigo ha uma parte que tenho de fazer a Listagem completa dos alunos juntamente com as notas do 1º 2º e 3º teste Soma e Média

A partida o display seria assim Exemplo:

1:vitor monteiro 1º Teste : 150 2º Teste : 133 3ª Teste : 167 : Soma : 450 Media: 150

o problema e que nao apresenta assim apresenta da seguinte forma vou exemplificar com quatro nomes e vou uzar valores repetidos para nao tar a fazer muintos calculos XD exemplo:

1º Teste : 150 2º Teste : 133 3ª Teste : 167 : Soma : 450 Media: 150

1º Teste : 150 2º Teste : 133 3ª Teste : 167 : Soma : 450 Media: 150

1º Teste : 150 2º Teste : 133 3ª Teste : 167 : Soma : 450 Media: 150

4: Manel Oliveira 1º Teste : 150 2º Teste : 133 3ª Teste : 167 : Soma : 450 Media: 150

por estranho que pareça o ultimo nome aparece sempre os outros parece que tao a ser overlaped pelos testes vou mostrar a parte do codigo que utilizo para fazer a listagem poça ser que me poça ajudar com algo

void menulista(){
    int i,escolha,j;
    float temp1,temp2,temp3;
    temp1= percent[1] *100;
    temp2= percent[2] *100;
    temp3= percent[3] *100;
   do{

    printf("\n\t -------Menu:Listagem-----------------");
    printf("\n\t|								    |");
    printf("\n\t| 1 - Lista completa  Formandos/notas|");
    printf("\n\t| 0 - Voltar						 |");
    printf("\n\t -------------------------------------");

    do{
		    printf("\n\t Escolha uma opçao:  ");
		    scanf("%d",&escolha);
	    }while(escolha<0 || escolha>1);

	    switch(escolha){
		    case 1:
			    printf("\n\t---------------Percentagens Atribuidas ------------------");
			    printf("\n\t|1º Teste: %.0f  :  2º Teste: %.0f  :  3º Teste: %.0f    |",temp1,temp2,temp3);
			    printf("\n\t----------------------------------------------------------");
			    //printf("\n\t Teste %.2f",percent[4]);

				 for(i=0; i<quantidadenomes(); i++){
					 if(percent[4]==100){
					    for(i=0;i<quantidadenomes();i++){
						    test[i] = test[i]*percent[1];
						    testt[i]= testt[i]*percent[2];
						    testtt[i]= testtt[i] *percent[3];
						    soma[i] =( test[i])+(testt[i])+(testtt[i]);
						    media[i] = soma[i];
					    }	 
					 }
					   else{
					    soma[i] =( test[i])+(testt[i])+(testtt[i]);
						   media[i] = soma[i] /3;
					   }
					  // if(nome[i][0]=='\0'){ break; }
					   printf("\n %3d: ",i+1);
					   imprimirnome(i);
					   if(test[i]>=0 && test[i]<=89){
						   printf(ERROR" 1º Teste: %.2f "LIMPAR,test[i]);
					   }
					   else if(test[i] >=90 && test[i]<=139){
						   printf(AMARELO" 1º Teste: %.2f "LIMPAR,test[i]);
					   }
					   else{
						   printf(GREEN" 1º Teste: %.2f "LIMPAR,test[i]);
					   }
					    if(testt[i]>=0 && testt[i]<=89){
						   printf(ERROR" 2º Teste: %.2f "LIMPAR,testt[i]);
					   }
					   else if(testt[i] >=90 && testt[i]<=139){
						   printf(AMARELO" 2º Teste: %.2f "LIMPAR,testt[i]);
					   }
					   else{
						   printf(GREEN" 2º Teste: %.2f "LIMPAR,testt[i]);
					   }
					    if(testtt[i]>=0 && test[i]<=89){
						   printf(ERROR" 3º Teste: %.2f "LIMPAR,testtt[i]);
					   }
					   else if(testtt[i] >=90 && test[i]<=139){
						   printf(AMARELO" 3º Teste: %.2f "LIMPAR,testtt[i]);
					   }
					   else{
						   printf(GREEN" 3º Teste: %.2f "LIMPAR,testtt[i]);
					   }

						 printf(" Soma : %.2f ",soma[i]);

					    if(media[i]>=0 && media[i]<=89){
							   printf(ERROR" Média : %.2f "LIMPAR,media[i]); 
					    }
					    else if(media[i]>=90 && media[i] <=139){
							   printf(AMARELO" Média : %.2f "LIMPAR,media[i]);
						   }
					    else{
							    printf(GREEN" Média : %.2f "LIMPAR,media[i]);
					    }  
				  }
				   break;   
	    }
  } while(escolha != 0);
}

Eu esperimentei a baixo onde Esta a funçao imprimirnome(i) por printf("\n\t");

e resolveu de serta forma Desculpe ter incomudado

Link to comment
Share on other sites

HappyHippyHippo

de certeza que isso imprime uma lista ?

for(i = 0; i  < quantidadenomes(); i++){
 if(percent[4] == 100){
   for(i = 0; i < quantidadenomes(); i++){
   }
   // no fim deste for, o i já é igual ao termo de paragem do ciclo for exterior ...
 }
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Viva, importas-te de elaborar acerca da inutilidade do atoi() e que usas para converter ascii para integer?

sscanf(ascii_number, "%d", &byte_number); // <-- facilidade de verificação de erro através do retorno da função

Já agora, apenas para referência, tens o strtol, que faz o mesmo que o atoi mas com controlo de erros e pode usar diferentes bases.

Edited by Flinger
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.