[RESOLVIDO] C - Manipulação de arquivos e matrizes

Iniciado por gabrieldlm, 06 de Abril de 2012, 01:16

tópico anterior - próximo tópico

gabrieldlm

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

Darcamo

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
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).

gabrieldlm

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

irtigor

Leia linha por linha, crie/use uma função pra separar por tokens (tipo a strtok), e grave no novo formato.

gabrieldlm

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


#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;
}

Darcamo

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)
#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;
}

gabrieldlm

#6
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

fpissarra

Talvez isso ajude:

#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;
}