Jump to content


Photo

Ler Um Arquivo Texto


  • Faça o login para participar
2 replies to this topic

#1 charles.mf

charles.mf

    Novato no fórum

  • Usuários
  • 1 posts
  • Sexo:Não informado

Posted 29/09/2005, 15:55

Olá pessoal....


Sou novo aki no forum então primeiramente gostaria de compprimentá-los pelo bom nível de discussão( o pouco que eu lí no forum , gostei ). Vamos à minha dúvida.

Desenvolvi uma ferramenta no matlab que filtra dados de um arquivo texto e divide este arquivo em quantos o usuário desejar. No matlab, tudo certo e está quebrando um abaita galho. Agora preciso migrar o programa para o C e aí que está o problema.

Eu gostaria de ler o arquivo texto abaixo.

P1 P2 P3 P4 P5 P6
50 6 55 32 14 14
20 5 40 32 4 5

e transformá-lo nos vetores p1=[50,20] p2=[6,5] p3=[55,40]...

No matlab, usei o comando textread e tudo ficou mais fácil. Agora no C não tenho idéia de como fazer para transformar tal arquivo em vários vetores. Alguém já se deparou com algo parecido???? Alguém tem alguma sugestão???? Valeu!!!

#2 Thales Medeiros

Thales Medeiros

    24 Horas

  • Usuários
  • 426 posts
  • Sexo:Não informado
  • Localidade:Juiz de Fora/MG
  • Interesses:Programação em geral. Programo em PHP, ASP, PERL, VB, Delphi, C/C++, Java e com banco d dados<br><br>Gosto tb d ajudar. Se precisar d mim, basta postar uma msg no Forum! Se eu souber, te responderei...

Posted 30/11/2005, 10:48

Oi, Charles! Tudo bem?

Olha... Amo programar em C++, mas dêvo dizer-lhe que vc está simplesmente migrando da mordomia para a performance.

No Matlab vc possui funções para desempenhar tudo o que precisar dentro da matemática, usando os mais variados métodos possíveis. O problema é que no Matlab vc tem um programa INTERPRETADO, que é MUITO mais lento que o programa compilado, como no C/C++. Creio que vc já deve ter sido informado sobre isto. A desvantagem do C/C++ é que vc precisará de implementar praticamente tudo o que precisar na mão!

No C/C++ padrão não possui uma função plot() que joga direto o gráfico na tela, nem uma função que já te traga a integral de uma função pelo método Newton-Hapson. Se quiser usar isto em C/C++ ou terá que penar pra procurar na Internet o código-fonte, ou terá que desenvolvê-lo na mão.

Bem.. Chega de abobrinhas e vamos responder sua dúvida!

Em primeiro lugar, como o Matlab criam-se programas interpretados, vc consegue em tempo real definir uma variável cujo nome é criado em tempo real. Mas no C isto não existe. Portanto, seria impossível vc carregar um nome de dentro de um arquivo e falar que este será o nome de uma variável. No entanto, basta vc saber que isto não é problema algum, pois em algum lugar aquela variável estará.

Algumas ressalvas:

- Não sei se vc realmente precisa de guardar os nomes P1, P2, P3, ..., P6. Mas se precisar, fale comigo. Considerarei q não devem ser importantes, portanto pularei a primeira linha.
- Este código funcionará somente para vetores de duas dimensões. Se precisar de mais dimensões, terá que reajustar o código. Não farei um código genérico, pois será mais difícil de ser compreendido e será bem mais extenso.

O código:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    //Variável contadora
    unsigned int i, numVetores, indiceBuffer, indiceMatrix;
    //Linhas de, no máximo, 100 caracteres
    char linha1[100], linha2[100], buffer[100];
    FILE *fp=fopen("c:\\cpp\\matriz\\debug\\arquivo.txt", "r");
    if(fp==NULL) return 0;
    //Descartando a primeira linha:
    fgets(linha1, 100, fp);
    //Aqui lemos os 100 próximos caracteres ou uma linha e guardamos
    fgets(linha1, 100, fp);
    //Próxima linha:
    fgets(linha2, 100, fp);
    //fechando o arquivo:
    fclose(fp);

    //Contando número de vetores existentes1:
    for(i=0,numVetores=1;i<strlen(linha1);i++)
        if(linha1[i]==' ') numVetores++;

    //Criando uma matriz de [numVetores , 2] posições:
    int **matrix;
    matrix=(int**) malloc(numVetores);
    for(i=0;i<numVetores;i++) matrix[i]=(int*) malloc(2);

    //Preenchendo o primeiro índice dos vetores:
    for(i=0, indiceBuffer=0,indiceMatrix=0;i<strlen(linha1);i++) {
        if(linha1[i]!=' ') buffer[indiceBuffer++]=linha1[i];
        if(linha1[i]==' ' || i==strlen(linha1)-1) {
            buffer[indiceBuffer]='\0';
            matrix[indiceMatrix][0]=atoi(buffer);
            ++indiceMatrix;
            indiceBuffer=0;
        }
    }

    //Preenchendo o segundo índice dos vetores:
    for(i=0, indiceBuffer=0,indiceMatrix=0;i<strlen(linha2);i++) {
        if(linha2[i]!=' ') buffer[indiceBuffer++]=linha2[i];
        if(linha2[i]==' ' || i==strlen(linha2)-1) {
            buffer[indiceBuffer]='\0';
            matrix[indiceMatrix][1]=atoi(buffer);
            ++indiceMatrix;
            indiceBuffer=0;
        }
    }

    for(i=0;i<numVetores;i++)
        printf("matrix[%d][0]=%d\nmatrix[%d][1]=%d\n\n", i, matrix[i][0], i, matrix[i][1]);
    return 0;
}

Espero que entenda o que o programa faz. Qualquer dúvida, é só perguntar! Precisa entender tudo, viu? Deu trabalho! Hehehehe...

Um abraço,
Thales Medeiros.
Sucesso é ganhar dinheiro fazendo o que você faria de graça.

#3 GGinani

GGinani

    Novato no fórum

  • Usuários
  • 1 posts
  • Sexo:Masculino
  • Localidade:Sao Paulo

Posted 08/02/2011, 23:07

Olá,

você poderia me ensinar como escrever este script de matlab com o textread?

Obrigado.

Giuliano




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq