Ir ao conteúdo

Arquivo para struct


pauluvitor

Posts recomendados

Postado

Bom dia galera, estou com um problema para passar as informações presentes em um arquivo para um vetor de variáveis struct. O que quero fazer é o seguinte, como os dados presentes no arquivo txt estão salvos de forma ordenada gostaria de conseguir armazenar essas informações em grupos(uma struct contendo duas strings e um inteiro).

 

O arquivo txt está escrito de maneira que sua primeira linha é um titulo de uma musica, sua segunda linha é o número de linhas da letra da música que vai ser apresentada e por final são escritas mais algumas linhas com a letra da música. Segue um exemplo:

 

 
 
Estou tentando armazenar isso em uma struct to tipo
 
typedef struct{
char titulo[100]; /*Essa armazena o titulo da música*/
int tamanho; /*Essa coleta a informação para a próxima leitura*/
char letra[100]; /*Essa armazena um certo numero de linhas determinado pela variável tamanho.*/
}rock;
 
Até o momento estou sem sucesso, tentei fazer dessa forma:
 
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char titulo[100];
int linha;
char letra[200];
}musica;
 
int main(){
int j=0;
int i;
 
musica panca[10];
FILE *file;
file=fopen("rock.txt", "r");
 
 
 
while(j<10){
fgets(panca[j].titulo,100,file);
fscanf(file, "%d", &panca[j].linha);
for(i=0;i<=panca[j].linha;i++){
fgets(panca[j].letra,200,file);
}
j++;
}
 
 
fclose(file);
 
printf("%s", panca[5].titulo);
 
 
return(0);
}
 
Postado

for(i=0;i<=panca[j].linha;i++){    fgets(panca[j].letra,200,file);}
Nessa parte acima, você tá sobrescrevendo "panca[j].letra" toda vez que um novo loop começa.

Se quiser colocar mais de uma linha na mesma variável vai precisar concatenar as strings com a função strcat() ou criar um vetor de strings.

Edit:

Esquece o que eu falei sobre o &. Esqueci que "titulo" e "letra" são vetores.

Postado

Obrigado pela ajuda, tentei aprimorar o programa com suas dicas porém ele ainda não está armazenando de forma correta. Como você sugeriu, fiz um vetor de strings dentro da struct para poder armazenar mais de uma linha.

 

#include<stdio.h>
#include<stdlib.h>
typedef struct{
char titulo[100];
int linha;
char letra[3][200];
}musica;
 
int main(){
int j=0;
int i;
int k;
 
musica panca[10];
FILE *file;
file=fopen("rock.txt", "r");
 
 
 
while(j<10){
 
fgets(&panca[j].titulo,100,file);
fscanf(file, "%d", &panca[j].linha);
k=panca[j].linha;
i=0;
while (i<k){
fgets(&panca[j].letra,200,file);
i++;
}
j++;
}
 
 
fclose(file);
 
 
printf("%s", panca[0].titulo);
 
printf("%s", panca[0].letra[1]);
 
 
return(0);
}
Postado

#include <stdio.h>#include <stdlib.h>typedef struct sMusica{	char titulo[100];	int linha;	char letra[3][200];} musica;int main() {	int j;	int i;	musica panca[10];	FILE *file;	file = fopen("rock.txt", "r");	for (i=0; i < 10; i++) {		fgets(panca[i].titulo, 100, file);		fscanf(file, "%d\n", &panca[i].linha);		for (j=0; j < panca[i].linha; j++)			fgets(panca[i].letra[j], 200, file);	}	fclose(file);    // isso aqui foi só pra testar mesmo, pode remover    // ------------------	printf("%s\n", panca[0].titulo);	printf("%d\n", panca[0].linha);	printf("1 %s\n", panca[0].letra[0]);	printf("2 %s\n", panca[0].letra[1]);	printf("3 %s\n", panca[0].letra[2]);    // -------------------	return(0);}
Testei o código aqui e funcionou.

Coloquei um "\n" na parte de pegar o número de linhas pro fscanf não ignorar a mudança de linhas entre a linha com o número de letras e o primeiro verso da letra.

Como eu falei antes no meu edit, não precisava colocar o & pra pegar o titulo e as letras. Você tava correto no início... eu que me confundi mesmo.

Edit:

Ah, tem duas coisas que você precisa ter cuidado nesse código... a primeira é se o número de músicas no arquivo for menor que 10.

E a segunda é se a música tiver mais de 3 linhas de letras.

O primeiro caso você resolve usando feof() a cada iteração do loop pra saber se já atingiu o final do arquivo (daí sai do loop prematuramente).

O segundo caso você resolve aumentando o número de linhas que a estrutura suporta, ou criando um outro método pra armazenar essas linhas (filas talvez).

Postado

Valeu cara, está me ajudando muito. Essa coisa no \n após o fscanf eu consegui resolver de outra maneira um pouco mais complicada. Percebi que todos os fgets que vinham depois de um fscanf vinham vazios, o que eu fiz foi sempre depois um fscanf eu dou um jeito de realizar 2 fgets, assim armazena-se corretamente. Vou tentar utilizar as novas dicas. Obrigado

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!