Autor Tópico: [RESOLVIDO] C - Manipulação de arquivos e matrizes  (Lida 10087 vezes)

Offline gabrieldlm

  • Usuário Ubuntu
  • *
  • Mensagens: 33
    • Ver perfil
[RESOLVIDO] C - Manipulação de arquivos e matrizes
« Online: 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...
« Última modificação: 12 de Abril de 2012, 00:52 por gabrieldlm »

Darcamo

  • Visitante
Re: C - Manipulação de arquivos e matrizes
« Resposta #1 Online: 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).

Offline gabrieldlm

  • Usuário Ubuntu
  • *
  • Mensagens: 33
    • Ver perfil
Re: C - Manipulação de arquivos e matrizes
« Resposta #2 Online: 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....

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: C - Manipulação de arquivos e matrizes
« Resposta #3 Online: 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.

Offline gabrieldlm

  • Usuário Ubuntu
  • *
  • Mensagens: 33
    • Ver perfil
Re: C - Manipulação de arquivos e matrizes
« Resposta #4 Online: 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;
}

Darcamo

  • Visitante
Re: C - Manipulação de arquivos e matrizes
« Resposta #5 Online: 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;
}

Offline gabrieldlm

  • Usuário Ubuntu
  • *
  • Mensagens: 33
    • Ver perfil
Re: C - Manipulação de arquivos e matrizes
« Resposta #6 Online: 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
« Última modificação: 07 de Abril de 2012, 23:38 por gabrieldlm »

Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: C - Manipulação de arquivos e matrizes
« Resposta #7 Online: 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;
}