Jump to content

Vector para ficheiro


John10
 Share

Recommended Posts

Imaginamos que queremos enviar para um ficheiro txt, valores em boolean em apenas uma funçao, ou seja, temos varios valores que é retornado para a saida dessa funçao para uma variavel. O problema é que essa variavel tem de ser adicionada varios valores para escrever no ficheiro.


double func1(int matriz[][20]);
void Resultados (FILE *fr, char *fp, double r24q, char *pathname);

int main(int argc, char *argv[])
{
         //(...)
         FMatriz(fp, matriz);
         r24q=func1(matriz);
         Resultados(fopen("nome.txt","a"), entrada->d_name, r24q, pathname);
}

double func1(int matriz[][20]){
       while(lin_f<=30){
          while(col_f<=20){
             for(i=lin_i; i<lin_f; i++){          
                 for(j=col_i; j<col_f; j++){

	     if((matriz[i][j])==1)
                     {
                         cont1++;
                     }
                     if((matriz[i][j])==0)
                     {
		             cont2++;
                     }
                     
                }
             }
             cont3++; 
             
             quad[cont3-1]=(cont1/cont2);
     printf("\n%f",quad[cont3-1]);
             
             col_i = col_i + 5;
             col_f = col_f + 5;
             cont1=0;
             cont2=0;
          }
          lin_i = lin_i + 5;
          lin_f = lin_f + 5;
          col_i=0;
          col_f=5;

          for(i=0; i<24; i++){
                    return quad[i];
          }
}

void Resultados (FILE *fr, char *fp, double r24q, char *pathname)
{	
    fprintf(fr,"%s ", fp);       
    fprintf(fr,"%f ", r24q);  
    fprintf(fr,"\n"); 
}

Como se escreve no ficheiro varios valores retornados... so aparece um valor mas queria os 24

Obrigado a quem poder ajudar 🙂

Link to comment
Share on other sites

isto:

double func1(int matriz[][20])

Não fica bem com isto:

if((matriz[j])==1)

Além de que:

for(i=0; i<24; i++){

                    return quad;

          }

uma vez feito return, sais da função. Logo o for apenas executa um ciclo.

Se queres fazer algo assim tens de alterar a função e retornar um apontador para um vector de doubles com os teus valores. Ou melhor, crias um vector de double na main, passas um apontador para esse vector na tua função e depois podes retornar o número de posições do vector.

Percebeste?

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <windows.h>
#include <sys/param.h>
#include <dirent.h>


//Funçoes
void FMatriz(FILE *fp, int matriz[][20]);
double FRacio24Q(int matriz[][20], double *quad);
void Resultados (FILE *fr, char *fp, double r24q[], char *pathname);

//Funçao Principal

int main(int argc, char *argv[])
{
FILE *fp, *fname2;
DIR *dirp;
char pathname[MAXPATHLEN],filename[MAXPATHLEN], nomef[128];
struct dirent *entrada;
int matriz[30][20];
double r24q[24], valor[24];
    int i;


          //Escolha da directoria
    printf("Directoria dos ficheiros?\n");
    fgets(pathname,MAXPATHLEN,stdin);
        
        if(pathname[strlen(pathname)-1]=='\n')
        {

           pathname[strlen(pathname)-1]='\0';
    }
    
        if((dirp=opendir(pathname))==NULL)
        {
	   printf("Erro ao abrir directoria\n");
	   exit(1);
    }

    
    //Procurar ficheiros da directoria 
    while((entrada=readdir(dirp))!=NULL)
        {
                                            
        //Filtragem
	if(strcmp(entrada->d_name,".")==0 || (strcmp(entrada->d_name,"..")==0))
        {
		continue;
	}
        
        //Abrir Ficheiro
	sprintf(filename,"%s\\%s",pathname,entrada->d_name);
	fp = fopen(filename,"r");

	if(fp==NULL)
        {
		printf("Erro na abertura do ficheiro \n");
        }
	//Mostra o nome do ficheiro
        printf("\nFicheiro: %s\\%s aberto  \n",pathname,entrada->d_name);	

        //chamamento de funçoes
FMatriz(fp, matriz);
for(i=0; i<24; i++)
{
                 r24q[i]=FRacio24Q(matriz, valor);
        }

        Resultados(fopen("vector.txt","a"), entrada->d_name, r24q, pathname);
        fflush(stdin);
      
        free(filename);
        fclose(fp);   
        }
    getchar();	
}

// Escrever Matriz
void FMatriz(FILE *fp, int matriz[][20]){
    
    FILE *fname2;
int i=0,j=0;
char num, nomef[128];	

num = fgetc(fp);  //Ler um caracter a partir de um fluxo

    //fprintf(fname2, nomef);
    while(num!=EOF) //Enquanto nao chegar ao fim do ficheiro
    { 
        if(num == '0') 
        {
               matriz[i][j]=0; 
               j++; //incrementa coluna (j)
                    
               if(j==20) //se a coluna é a ultima passa para a linha de baixo (incrementa i e j passa a 0)
               {
                    i++;
                    j=0;
               }
        }
             
        //Senao, o num é '1', preenche na matriz a posiçao
        if(num == '1')
        {
               matriz[i][j]=1; 
               j++; //incrementa coluna (j)
                    
               if(j==20) //se a coluna é a ultima passa para a linha de baixo (incrementa i e j passa a 0)
               {
                    i++;
                    j=0;
               }
        } 
                 
             //Voltar a ler o valor   
        num = fgetc(fp);     
    }
    
    for (i=0; i<30; i++)
        { 
            for (j=0; j<20; j++) 
            {
                //Imprimir matriz no ecra
                printf ("%d", matriz[i][j]);
            }
            //mudança de linha
            printf("\n");
        } 
fclose(fp);
}

double FRacio24Q(int matriz[][20], double *quad){
       double cont1=0, cont2=0;
       int i=0, j=0, c=0;
       int lin_i=0;
       int lin_f=5;
       int col_i=0;
       int col_f=5;
       int cont3=0;
       
       printf("\n\nEm 24 Quadrantes\n");
       
       for(i=0; i<24; i++){
                quad[i]=0;
       }
       
       while(lin_f<=30){
          while(col_f<=20){
             for(i=lin_i; i<lin_f; i++){          
                 for(j=col_i; j<col_f; j++){

                     //Conta 1s e 0s na matriz
	             if((matriz[i][j])==1)
                     {
                         cont1++;
                     }
                     if((matriz[i][j])==0)
                     {
		             cont2++;
                     }
                     
                }
             }
             cont3++; 
             
             //Calcula racio
             
             printf("\nQuadrante %d", cont3);
         printf("\nNumero de 1s: %f",cont1);
         printf("\nNumero de 0s: %f",cont2);
             
             quad[cont3-1]=(cont1/cont2);
         printf("\nRacio: %f\n\n\n",quad[cont3-1]);

        // lin_i = lin_i + 5;
            // lin_f = lin_f + 5; 
             col_i = col_i + 5;
             col_f = col_f + 5;
             cont1=0;
             cont2=0;
          }
          lin_i = lin_i + 5;
          lin_f = lin_f + 5;
          col_i=0;
          col_f=5;
       }
      
}

void Resultados (FILE *fr, char *fp, double r24q[], char *pathname)
{

int i=0;


        for(i=0; i<24; i++)
        {
               printf("%f ", r24q[i]);
               fprintf(fr,"%f ", r24q);     
               fprintf(fr,"\n"); 
        }
}

O meu codigo esta assim mas nao sei como enviar valores para o vector e imprimir no ficheiro

Link to comment
Share on other sites

Sabes utilizar passagem por referência?

dentro da main(), defines o teu vector que queres imprimir.

Chamemos-lhe

int imprimir[30];

Defines um apontador para o mesmo:

int *ptr_imprimir;

defines para onde é que o apontador vai apontar. Escolhemos o primeiro valor do vector:

ptr_imprimir = &imprimir[0];

Depois a tua função, é algo assim:

int faz_algo_por_referencia( int * ptr_vector)

E dentro dessa função fazes o que tens a fazer a esse mesmo vector.

Depois na função main, imprimes os valores do vector definido inicialmente.

Tás a compreender?

Eu acho estranho como é que no código que apresentaste usas a passagem por referência bem como outras coisas relativamente complicadas e ainda não percebeste o conceito de vector e passagem por referência. :\

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

Eu continuo a achar estranho como é que abres directórios, abres ficheiros, fazes flush do stdin, mas não sabes usar apontadores. :|

Não é assim tão estranho, bubulindo!

Eu também abro e edito ficheiros, e não sei nada sobre apontadores... Na universidade, aprende-se directórios e ficheiros em C e apontadores... nada! 🙂

Cumpz.

Knowledge is free!

Link to comment
Share on other sites

Não é assim tão estranho, bubulindo!

Eu também abro e edito ficheiros, e não sei nada sobre apontadores... Na universidade, aprende-se directórios e ficheiros em C e apontadores... nada! 🙂

Cumpz.

:| Sendo assim, peço desculpa. E já tentaste ir falar com o professor e pedir-lhe uma explicação sobre isso? Eu sei que a probabilidade de seres "enxotado" com um título dum livro é grande... mas existe também a possibilidade de teres ali uma lição "one on one" e ficares a perceber isso.

Defines o vector, abres o ficheiro, usas a fscanf(), read(), ou no teu caso até a fgetc() e a variável retornada é enviada para o vector.

Podes tentar algo deste género:

char c, linha=0, coluna=0; 
char mat [5][5]; //exemplo com 5x5
while ((c = fgetc(ficheiro")) != EOF)
    {
    if ( isdigit(c))
        mat[coluna++][linha] = c;
    else
        {
        if (c == '\n') //fim de linha
            linha++;
        }
//não precisa de fazer nada se for espaço. 
    }

Claro que existem outras maneiras de o fazer, esta é apenas uma e nem sequer será a melhor uma vez que lê um caracter de cada vez para memória. Podes tentar o mesmo, mas lendo primeiro para uma string e depois fazer a seriação dos dados desta forma. Mas já deve ajudar.

Por fim, aproveito para vos dizer que utilizar apontadores é vital para perceber e conseguir utilizar C completamente, pelo que se o professor não fala disso, vocês deverão tentar aprender doutra forma.

include <ai se te avio>

Mãe () {

}

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.