Fscanf ou Fread em C++ [RESOLVIDO]

1. Fscanf ou Fread em C++ [RESOLVIDO]

william jussim
jussim

(usa Ubuntu)

Enviado em 23/11/2019 - 15:13h

Boa Tarde,

Estou com uma dificuldade. Estou estudando C++ e tentando fazer um pequeno programinha para treinar a linguaguem e que pode me ajudar com uns controles domesticos. Meu problema é o seguinte, preciso ler um arquivo txt com 100 linhas e em cada linha eu tenho cerca de 20 numeros. Preciso armazenar isso em uma matriz.
Tentei fazer com a função fread, mas nao estou conseguindo nem mesmo ler uma linha completa, porém com a funcão fscanf eu consigo ler uma linha sem problemas. Já vi alguns videos mas nao consigo entender bem como implementar a função fread e parece que a função fscanf não serve para preencher matrizes. Alguem pode me dar uma explicação em como preencher ao menos um vetor com o fread?

A seguir esta o codigo que tentei implementar baseado em outros algoritmos da internet mas nao entendo o porque nao consigo preencher corretamente.
while (1){
size_t r = fread(&i[b], sizeof(int), 1, arq);
b++;
if(r < 1){

break;
}

}


a variavel i é o meu vetor;
arq é o arquivo txt que estao os dados;




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/11/2019 - 02:45h

jussim escreveu:

Boa Tarde,

Estou com uma dificuldade. Estou estudando C++ e tentando fazer um pequeno programinha para treinar a linguaguem e que pode me ajudar com uns controles domesticos. Meu problema é o seguinte, preciso ler um arquivo txt com 100 linhas e em cada linha eu tenho cerca de 20 numeros. Preciso armazenar isso em uma matriz.
Tentei fazer com a função fread,


Se arquivo é de texto, você não deve usar fread(), pois tal função é explicitamente voltada para a leitura de dados em formato binário e de tamanho fixo.

mas nao estou conseguindo nem mesmo ler uma linha completa, porém com a funcão fscanf eu consigo ler uma linha sem problemas.


fscanf() é uma das funções válidas para leitura de arquivos de texto. Mas se você quiser ler linhas, melhor ainda é usar fgets() ou getline() (que não é do padrão do C, mas existe no Linux e em sistemas compatíveis com POSIX.1-2008).

EDIT (2019/11/25 09:20): Reparei depois que você falou em C++. Sendo assim, você pode usar std::ifstream em conjunto com std::getline(), e também, se quiser, std::istringstream para extrair cada componente da linha lida com std::getline(), como no exemplo abaixo.
std::vector<std::vector<int>> tabela;	// Array bidimensional alocado dinamicamente (se quiser, pode fazer com array nativos, de tamanho fixo).
std::ifstream arq("arquivo.dat");
std::string linha;
while(getline(arq, linha)){ // Note que esta é uma operação de leitura de texto.
std::istringstream extrator(linha);
int n;
if(extrator >> n){ // Aqui também, a operação de leitura é de extração de texto formatado.
// Adiciona uma linha nova à tabela, contendo, inicialmente, apenas o primeiro elemento extraído.
tabela.push_back(std::vector<int>(1, n));

// Acrescenta os demais elementos da linha lida como colunas da última linha da tabela.
while(extrator >> n)
tabela.back().push_back(n);
}
}


Já vi alguns videos mas nao consigo entender bem como implementar a função fread e parece que a função fscanf não serve para preencher matrizes.


Eu não estou ciente de nenhuma função do C voltada para matrizes, não apenas no que diz respeito a leitura de dados, mas para qualquer finalidade. Quando se fala em matrizes, normalmente se espera, em C, que você trabalhe com elemento por elemento.

EDIT (2019/11/25 09:20): Nem do C++.

Alguem pode me dar uma explicação em como preencher ao menos um vetor com o fread?


Não, se realmente a origem dos dados for um arquivo de texto.

A seguir esta o codigo que tentei implementar baseado em outros algoritmos da internet mas nao entendo o porque nao consigo preencher corretamente.
while (1){
size_t r = fread(&i[b], sizeof(int), 1, arq);
b++;
if(r < 1){

break;
}

}


a variavel i é o meu vetor;
arq é o arquivo txt que estao os dados;


Esse código funcionaria para ler dados de um arquivo binário, em que cada dado individual fosse compatível com int. Note, no entanto, que aqui você não tem matriz nenhuma, e nem ao menos tenta saber se chegou ao que seria o fim de uma linha, mas apenas lê valores indefinidamente para um vetor (não uma matriz), até uma condição que parece ser satisfeita apenas no fim do arquivo.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)

3. Resolvi

william jussim
jussim

(usa Ubuntu)

Enviado em 28/11/2019 - 11:49h

Consegui resolver o que estava tentando fazer. Na verdade o arquivo era um conjunto de inteiros que precisa armazenar de forma tabelada, por isso uma matriz, eram cerca de 10^5 numeros diferentes.
consegui ir populando a matriz a medida que ia fazendo a leitura dos dados. Com o fscanf mesmo. Dessa forma:
for ( i=0; i<limite; i++ ){
for ( j=0; j<15; j++ ){
fscanf(arq,"%d",&matriz[i][j]);
}
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts