3
respostas

Dúvidas

Nesse exercício, que é para ler e imprimir uma matriz, está ocorrendo algum erro, consegui fazer de outra maneira, porém queria saber como o código que o professor colocou como resolução funcionaria.

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

int main() { 

    int numeros[20][10];

    FILE* f;
    f = fopen("inteiros_teste.txt","r");
    if(f == 0){
        printf("Erro na leitura do arquivo.");
        exit(1);
    }
    for(int i = 0; i < 20; i ++){
        for(int j = 0; j < 10; j ++){
            fscanf(f,"%d", numeros[i][j]);
            printf("%d ", numeros[i][j]);
        }
        printf("\n");
    }
}

A matriz no arquivo inteiros_teste.txt é essa:

1369456901

2470548700

3580633801

4691724500

5702812411

6803909110

7914007311

8025091210

9036180641

9147275540

8258368021

7369457450

6470549931

5580636870

4691724781

3702814560

2803906491

1914002290

0025090191

0036181090

As perguntas são as seguintes:

1ª) No arquivo os números devem ser separados por um espaço ou não? Imagino que se eles ficarem juntos, eles serão lidos como um número só, não?

2ª) Para que serve colocar um espaço após ou antes do %d, como " %d" ou "%d ".

3ª) Como faço para consertar o código que coloquei?

3 respostas

1ª) seria 1 número por linha

2ª) para formatação, para separar os números impressos na tela

3º) o único acerto que precisa é o uso do operador & para passar o ponteiro da posição da matriz para o fscanf

O código funcionando e com arquivo de inteiros exemplo está em https://repl.it/@chicofig/Duvida-Matrizes

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

int main() { 

    int numeros[20][10];

    FILE* f;
    f = fopen("inteiros_teste.txt","r");
    if(f == 0){
        printf("Erro na leitura do arquivo.");
        exit(1);
    }
    for(int i = 0; i < 20; i ++){
        for(int j = 0; j < 10; j ++){
            fscanf(f,"%d", &numeros[i][j]);
            printf("%d ", numeros[i][j]);
        }
        printf("\n");
    }
}

Vi sua resposta, mas desse modo eu não estou lendo matrizes, estou lendo apenas um caractere por linha, não é? Mesmo assim, não funciona, ele não imprime a matriz. Sabia que os espaços eram pra formatação, mas eles tem mais alguma função que o professor comentou, mas não consegui entender.

1.) Primeiramente o resultado depende da solução que você procura, então vou assumir que queremos uma matriz e não precisa separar os números, nesse caso você precisa limitar o campo do número a ser lido no especificador de formato %d que vai ficar assim %1d, isso quer dizer que só deve ser lido 1 casa decimal desse número por vez, assim você terá dez inteiros de um algarismo cada para cada linha da matriz.

2.) Além da formatação, o espaço, quando usado no scanf, serve para limpar o "enter" do buffer do teclado.

3.) Precisa colocar o & para passar o endereço da posição da matriz, assim a função fscanf pode escrever lá e escrever o número 1 no especificador de formato [%1d], o arquivo pode continuar do jeito que está.

O código fica assim:


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

int main() { 
    int numeros[20][10];

    FILE* f;
    f = fopen("inteiros_teste.txt","r");
    if(f == 0){
        printf("Erro na leitura do arquivo.");
        exit(1);
    }
    for(int i = 0; i < 20; i ++){
        for(int j = 0; j < 10; j ++){
            fscanf(f," %1d", &numeros[i][j]);
            printf("%d ", numeros[i][j]);
        }
        printf("\n");
    }
}

Espero ter ajudado

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software