Ir ao conteúdo
  • Cadastre-se

C Como avançar a linha na leitura de arquivo em C


Posts recomendados

Estou tendo dificuldade em um programa onde tenho que ler um arquivo .mtx vindo da internet que possui dados de uma matriz qualquer, onde todos esses arquivos tem um cabeçalho que começa com o símbolo de porcentagem(%). Estava pensando em fazer uma comparação do primeiro caractere da linha com o símbolo "%" e que se fosse verdade, começasse a ler a linha logo abaixo no arquivo ( como eu passo para a leitura da próxima linha ignorando o resto da linha de onde encontrei o % como primeiro caractere). 

O código ainda está no início do desenvolvimento mas é o que tem: 

 

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

// Funções 

struct inf_matriz{
    char nome[30];
    int m;
    int n;
    int nnz;
};

struct inf_matriz tela_inicial(){
    struct inf_matriz retornainf;
    char ch, ch2 ='%';
    printf("-----------------------------------------\n");
    printf("   Trabalho de Algoritmos Numericos\n");
    printf("-----------------------------------------\n");
    AQUI: printf("\nDigite o nome do arquivo da matriz a ser carregada(com .mtx):\n");
    scanf("\n%[^\n]", retornainf.nome);
    FILE *arq_matriz = fopen(retornainf.nome,"r");
    if(arq_matriz == NULL){
        printf("Arquivo nao encontrado ou nao existente! Tente novamente.");
        goto AQUI;
    }
    else{
        fscanf(arq_matriz,"%c", &ch);
        printf("%c", ch);
        if(ch == ch2){
            // como pula pra próxima linha ( lendo os número 3312 3312 20793 do exemplo do arquivo abaixo)?
        }         
        fscanf(arq_matriz,"%d %d %d", &retornainf.m, &retornainf.n, &retornainf.nnz);
        fclose(arq_matriz);
        return retornainf;
    }
}

int main(){
    struct inf_matriz dadosA;
    dadosA = tela_inicial();
    printf("\n-----------------------------------------\n");
    printf(" Dados da Matriz '%s' aberta:\n", dadosA.nome);
    printf(" m:%d\n"" n:%d\n" " nnz:%d\n", dadosA.m, dadosA.n,  dadosA.nnz);
    printf("-----------------------------------------\n");
    double **matrizA;
    matrizA = (double**)calloc(dadosA.n,sizeof(double*));
    return 0;
}

 

OBS: não consigo mandar os arquivos de texto das matrizes por serem de formato ''.mtx'', mas o padrão dos arquivos é mais ou menos como o abaixo:

%%MatrixMarket matrix coordinate real general
3312 3312 20793
1 1  1.0000000000000e+00
2 2  1.0000000000000e+00
3 3  1.0000000000000e+00
4 4  1.0000000000000e+00
5 5  1.0000000000000e+00
6 6  1.0000000000000e+00
...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@GuilhermeFiorezi     seu código está bom, está funcionando bem , e para ele pular para segunda linha do arquivo você precisa colocar esse loop aqui :

while((ch = fgetc(arq_matriz)) != EOF){
    if(ch=='\n') break;/* esse  \n  eh o final da linha, aqui pula uma linha */
    /* para pular outra linha precisa ir até encontrar outro  \n */
}

assim ele pula para a segunda linha  então se você quiser pular mais uma linha, repita essas linhas aí de cima ,    e você precisa ter o arquivo nome_do_arquivo . mtx   já salvo na mesma pasta do seu programa  e que ele esteja nesse formato que você colocou ,    e seu código com essas modificações ficou assim :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Funções
struct inf_matriz{
    char nome[30];
    int m;
    int n;
    int nnz;
};
struct inf_matriz tela_inicial(){
    struct inf_matriz retornainf;
    char ch, ch2 ='%';
    printf("-----------------------------------------\n");
    printf("   Trabalho de Algoritmos Numericos\n");
    printf("-----------------------------------------\n");
    AQUI: printf("\nDigite o nome do arquivo da matriz a ser carregada(com .mtx):\n");
    scanf("\n%[^\n]", retornainf.nome);
    strcat(retornainf.nome,".mtx");/*coloca o .mtx no nome do arquivo, para pode abrir para ler */
    FILE *arq_matriz = fopen(retornainf.nome,"r");
    if(arq_matriz == NULL){
        printf("Arquivo nao encontrado ou nao existente! Tente novamente.");
        goto AQUI;
    }
    else{
        fscanf(arq_matriz,"%c", &ch);
        printf("%c", ch);
        if(ch == ch2){
            while((ch = fgetc(arq_matriz)) != EOF){
                if(ch=='\n') break;/* esse  \n  eh o final da linha, aqui pula uma linha */
                /* para pular outra linha precisa ir até encontrar outro  \n */
            }
            // como pula pra próxima linha ( lendo os número 3312 3312 20793 do exemplo do arquivo abaixo)?
        }
        fscanf(arq_matriz,"\n%d\n %d\n %d\n\t", &retornainf.m, &retornainf.n, &retornainf.nnz);
        fclose(arq_matriz);
        return retornainf;
    }
}
int main(){
    struct inf_matriz dadosA;
    dadosA = tela_inicial();
    printf("\n-----------------------------------------\n");
    printf(" Dados da Matriz '%s' aberta:\n", dadosA.nome);
    printf(" m:%d\n"" n:%d\n" " nnz:%d\n", dadosA.m, dadosA.n,  dadosA.nnz);
    printf("-----------------------------------------\n");
    double **matrizA;
    matrizA = (double**)calloc(dadosA.n,sizeof(double*));
    return 0;
}
/*
OBS: não consigo mandar os arquivos de texto das matrizes por serem de formato ''.mtx'', mas o padrão dos arquivos é mais ou menos como o abaixo:
%%MatrixMarket matrix coordinate real general
3312 3312 20793
1 1  1.0000000000000e+00
2 2  1.0000000000000e+00
3 3  1.0000000000000e+00
4 4  1.0000000000000e+00
5 5  1.0000000000000e+00
6 6  1.0000000000000e+00
...
*/

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...