Fórum Ubuntu Linux - PT

Suporte Técnico => Programação e Scripts => Tópico iniciado por: gabrieldlm em 06 de Abril de 2012, 01:16

Título: [RESOLVIDO] C - Manipulação de arquivos e matrizes
Enviado por: gabrieldlm em 06 de Abril de 2012, 01:16
Ola pessoal,

Estou com um problema , tenho um arquivo csv com n(numero de linhas variavel) linhas e 15 colunas, como faço pra guardar os números ( todos os dados são números) em uma matriz pra poderem ser manipulados posteriormente. Pensei em utilizar matlab octave ou afins mas preciso de rapidez.


Se alguem puder dar uma luz...
Título: Re: C - Manipulação de arquivos e matrizes
Enviado por: Darcamo em 06 de Abril de 2012, 01:38
Isso deve ser fácil de fazer em Python.

Por exemplo, suponha que você tenha um arquivo de texto chamado dados.txt com o conteúdo abaixo
1, 2, 3
4, 5, 6
7, 7, 7


Você pode lê-lo e interpretar o resultado como uma matriz (um array bidimensional) em Python apenas com as duas linhas abaixo
Código: [Selecionar]
import numpy
a = numpy.loadtxt('dados.txt', delimiter=',')

Se a função loadtxt do numpy não for suficiente, você pode usar o módulo "csv" que serve exatamente para isso (nunca usei, mas parece ser bem poderoso).
Título: Re: C - Manipulação de arquivos e matrizes
Enviado por: gabrieldlm em 06 de Abril de 2012, 01:50
Pois é, eu tinha pensado em Python ,C# e Java tambem, mas é que eu vou ter que rodar uns 100 programas assim ao mesmo tempo =/ e o cluster da faculdade (infelizmente) não é só pra mim nem só pra graduação....
Título: Re: C - Manipulação de arquivos e matrizes
Enviado por: irtigor em 06 de Abril de 2012, 08:20
Leia linha por linha, crie/use uma função pra separar por tokens (tipo a strtok), e grave no novo formato.
Título: Re: C - Manipulação de arquivos e matrizes
Enviado por: gabrieldlm em 06 de Abril de 2012, 08:52
Então, acho que ta acontecendo algum estouro de memoria , porque quando ele vai imprimir o resultado de cada elemento (pra checar se ta tudo certo) ele imprime valores do tipo 0 4195230 -1209374720, sendo que todos são maiores que 1 e menores que 1000. Se puder dar uma luz seria muito bom

Código: [Selecionar]
#include <stdio.h>

#define LINHA                           725
#define COLUNA                      15

int main(){
    int i,j,k;
    int *matrix[LINHA][COLUNA];
    int *vet[25];
    FILE *data;
    data = fopen("data.txt","r");
    for(i=0;i<LINHA;i++){
for(j=0;j<COLUNA;j++){
    fscanf(data,"%d",&matrix[i][j]);
            printf("%d\n",matrix[i][j]);
}
    }
   fclose(data);

   for(i=0;i<LINHA;i++){
       for(j=0;j<COLUNA;j++){
           for(k=1;k<26;k++){
       if(&matrix[i][j] == k){
           vet[k]=vet[k]++;
       }
           }
       }
   }
   return 0;
}
Título: Re: C - Manipulação de arquivos e matrizes
Enviado por: Darcamo em 07 de Abril de 2012, 17:44
Você está tentando ler um arquivo e interpretar seu conteúdo como uma matriz usando o fscanf. Apenas o fscanf não é muito robusto e o arquivo tem que estar exatamente no formato esperado. Nesse caso em particular, as diferentes colunas devem estar separadas apenas por espaços e não pode ter ",", por exemplo. Caso contrário você obterá esses números estranhos.

Consegui ler um arquivo (chamado dados.txt) com o conteúdo abaixo
1 2 4
4 5 6
7 7 7
8 8 10
9 9 11

com o seguinte código (pequenas mudanças no seu código)
Código: [Selecionar]
#include <stdio.h>

#define LINHA 5
#define COLUNA 3

int main()
{
    int i,j,k;
    int matrix[LINHA][COLUNA];
    int vet[25];
    FILE *data;
    data = fopen("dados.txt","r");
    for(i=0;i<LINHA;i++){
        for(j=0;j<COLUNA;j++){
            fscanf(data,"%d", &matrix[i][j]);
            printf("%d\n",matrix[i][j]);
        }
    }
    fclose(data);
    printf ("%s\n","Arquivo fechado");
   
    for(i=0;i<LINHA;i++)
    {
        for(j=0;j<COLUNA;j++)
        {
            for(k=1;k<26;k++)
            {
                if(matrix[i][j] == k)
                {
                    vet[k]=vet[k]++;
                }
            }
        }
    }
    return 0;
}
Título: Re: C - Manipulação de arquivos e matrizes
Enviado por: gabrieldlm em 07 de Abril de 2012, 22:42
Vlw , mas está tendo o mesmo problema do código anterior , ele consegue lidar até com umas 300 linhas, mas acima disso dá o mesmo problema

EDIT: na verdade era um erro bobo era so aumentar o tamanho do vet[] problema resolvido
Título: Re: C - Manipulação de arquivos e matrizes
Enviado por: fpissarra em 07 de Abril de 2012, 23:58
Talvez isso ajude:

Código: [Selecionar]
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>

#define MAX_COLUMNS 15

int tmpline[MAX_COLUMNS]; /* Contém uma linha temporária */
int **matrix = NULL;      /* Eis a matriz */
int num_lines = 0;        /* Numero de linhas da matriz. */

/* Funções auxiliares */
int *add_line(void);
int readline(FILE *, int *);

int main(int argc, char **argv)
{
  FILE *f;
  int *p;

  f = fopen(argv[1], "rt");
  if (f == NULL)
  {
    fprintf(stderr, "Error opening input file.\n");
    return EXIT_FAILURE;
  }

  while (readline(f, tmpline))
  {
    p = add_line();
    if (p == NULL)
    {
      fprintf(stderr, "Error allocating line.\n");
      memcpy(p, tmpline, MAX_COLUMNS * sizeof(int));
    }   
  }

  fclose(f);

  /* Neste ponto, seu array de int's deve conter a matriz */

  return EXIT_SUCCESS;
}

int readline(FILE *f, int *data_ptr)
{
  int i;
  char buffer[1024];
  char *p;

  if (fgets(buffer, 1024, f) != NULL)
  {
    p = strtok(buffer, ",");
    for (i = 0; p != NULL && i < MAX_COLUMNS; i++)
    {
      data_ptr[i] = atoi(p);
      p = strtok(NULL, ",");
    }

    return 1;
  }

  return 0;
}

int *add_line(void)
{
  int **p, *p2;
  int n;

  n = num_lines + 1;
  p = realloc(matrix, sizeof(int *)*n);

  if (p == NULL)
    return NULL;

  p2 = malloc(sizeof(int)*MAX_COLUMNS);
  if (p2 == NULL)
    return NULL;

  matrix = p;
  matrix[num_lines] = p2;
  num_lines = n;

  return p2;
}