Jump to content
vitor monteiro

Importar arquivo externo

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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
vitor monteiro

pensei que o atoi fazia a converçao direta sem eu ter de fazer 50 linhas de codigo para tal mas se o senhor diz que nao a necessidade eu acredito =)

Share this post


Link to post
Share on other sites
HappyHippyHippo

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


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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
HappyHippyHippo

essas cinco linhas quer dizer o quê ?

o que representa cada valor que apresentaste ?

responde às perguntas !!!


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

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
HappyHippyHippo

o código para leitura directa de um valor decimal é semelhante:

float variavel;
fscanf(fp, "%f", &variavel);

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
bubulindo

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 () {

}

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
bubulindo

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 () {

}

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
Flinger

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.