Ir ao conteúdo

Posts recomendados

Postado

Boa tarde a todos.

Estou tendo muita dificuldade em um exercício de C. Ele pede para ler um arquivo entrada.txt onde tem vários filmes com seus diretores(cada filme em uma linha com seus autores, separando por FILME/DIRETO1;DIRETOR2;...;DIRETORn) e pede para modificar um arquivo saida.txt, colocando cada filme na ordem alfabética. 

Não estou conseguindo armazenar cada linha do arquivo em 1 string separada, para depois modificar.


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main (void){
    char c;                 //le caractere por caractere
    char letra = '\n';      // define o fim da linha 
    int numLinhas = 0;         //numero de numLinhas no arquivo 
    char letraBarra = '/';  //caractere que separa livro autor  
    char letraPonto = ';';  //caractere que separa os autores
    int j = 0;
    int i;
    FILE *entrada = fopen("arquivo1.txt", "r");
    FILE *saida = fopen("arquivo2.txt", "w");

    //testando abertura arquivos 
    if(entrada == NULL){
        printf("Erro ao abrir o arquivo");
        exit(1);
    }
    if(saida == NULL){
        printf("Erro ao abrir o arquivo");
        exit(1);
    }
    
    //contando quantidade de linahs no arquivo
    while(fread (&c, sizeof(char), 1, entrada)){
        if(c == letra) { //se a ultima letra for \n é porque a linha acabou, somando +1
            numLinhas++;    //numero de linhas
        }
    } 

    char conteudoLinhas[numLinhas][100]; //o conteudo completo de cada linha do arquivo
    char *resultado;
    char conteudo[100];

    while(!feof(entrada)){
        resultado = fgets(conteudo, 100, entrada);
        if(resultado){
           for(int j =0; j<strlen(conteudo); j++){
               conteudoLinhas[i][j] = conteudo[j];
           }
            i++;
        }
    }
    fprintf(saida, "%s",conteudoLinhas);

    fclose(entrada);
    fclose(saida);
    return 0;
}

 

  • Amei 1
Postado

Você não pode escrever isso em C

 

1 hora atrás, Estalha disse:
char conteudoLinhas[numLinhas][100]; //o conteudo completo de cada linha do arquivo
   

 

a dimensão do vetor deve ser uma constante. Há até uma extensão que permitiria isso, mas recomendo o simples: não use.

 

Ou use um valor máximo ou aloque memória em blocos.

 

E entenda que de qualquer modo já está assumindo algo mesmo, porque está fixando o máximo de colunas em 100 e tem esse risco de não caber

 

Use um certo tamanho, como 64K por bloco e vá lendo os dados.

 

Imagino que vá manter os dados todos na memória durante a classificação então apenas crie uma função de comparação entre duas linhas, que pare logo depois do nome do filme.

 

 

 

 

  • Curtir 1
Postado

Ajude os outros a te ajudar: poste um arquivo de teste! 

Ou as primeiras 20 linhas dele. Assim se tem uma linguagem comum...

agora, vangodp disse:

o modo mais fácil é carregar tudo na memória em um vetor de structs, organizar e escrever tudo no arquivo. mas cada professor é um mundo

 

:) não precisa de structs: não há estrutura: apenas uma linha por filme. Basta parar de comparar na primeira '/' que é o separador.

 

Pode ser apenas char** e um contador, como em main()

  • Curtir 1
Postado
25 minutos atrás, vangodp disse:

logo um array.

mas si diz que n sabe sobre arrays de structs melhor esquecer mesmo

 

Pode ser mas não é preciso: trata-se apenas de classificar por ordem de filme. Em nenhum lugar diz que versões do mesmo filme devem estar classificadas por diretor. E mesmo assim como todos os campos estão na mesma linha basta classificar por linha.

 

Considere

 

FILME 42/Diretor BA/Diretor 3
FILME 42/Diretor AB/Diretor 3
FILME 21/Diretor 1/Diretor 3

 

Apenas na hora de comparar pode vir a considerar os campos. E de todo modo são strings.

 

Pode usar char* Filme ou char** Filme apenas.

  • Obrigado 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!