Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
GuilhermeFiorezi

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

Recommended Posts

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

Editado por GuilhermeFiorezi
Primeira parte consegui resolver
  • Curtir 1

Compartilhar este post


Link para o post
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
...
*/

 

Editado por devair1010

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×