Ir ao conteúdo
  • Cadastre-se

C Imprimindo caracteres estranhos no arquivo destino


Estalha

Posts recomendados


Boa noite a todos.

Estou tendo problema em um exercício, onde devo ler o titulo de vários livros separados por "/" e logo ao lado o estoque do livros em 5 lugares diferentes. Depois devo escrever em um novo arquivo txt o nome de cada um sem o estoque, porém na hora de escrever, saem vários caracteres estranhos. Alguém pode me ajudar pff.

O formato do txt original é:  /* LIVRO/ 1 2 3 4 5 

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

#define MAX 127

FILE * openFile(const char * file, const char * mode);
int contaLinhas(FILE *file);
float calculaMedia(FILE * file);

int main (void){
    FILE *entrada = openFile("arquivoOrigem.txt", "r");
    FILE *titulo = openFile("arquivoDestino1.txt", "wb"); //w+ porque caso o arquivo não exista, ele cria o arquivo 
    FILE *estoque = openFile("arquivoDestino2.txt", "wb");

    char bigName[MAX];
    int x = 0;
    int i = 0;
    int numLinhas;
    

    numLinhas = contaLinhas(entrada);

    float *vetorMedias=(float*)malloc((numLinhas)*sizeof(float));
   

    //checar alocacao de memoria
   
    if (vetorMedias ==NULL){
        printf("Erro ao alocar memoria");
        exit(1);
    }
    
    //montando vetor com media de estoque de livros
    while(i < numLinhas){
        vetorMedias[i]=calculaMedia(entrada);
        i++;
    }
    
    char **nomeLivros = (char**)malloc((numLinhas)*sizeof(char));

    if (nomeLivros == NULL){
        printf("Erro ao alocar memoria");
        exit(1);
    }
    
    for(int w =0; w<numLinhas; w++){
        nomeLivros[w] =(char *)malloc((strlen(bigName)+1)*sizeof(char));
        if (nomeLivros[w] == NULL){
            printf("Erro na alocacao dinamica.\n");
            exit(1);
        }
    }
    
    while(x < numLinhas){
        char criaLinha='\0';
        
        fscanf(entrada, "%[^/\n]s", bigName);
        while ((criaLinha!='\n') && (criaLinha !=EOF )){
            criaLinha=fgetc(entrada);
        }
        
        strcpy(nomeLivros[x], bigName);
        x++;
    }    
    
    //criando arquivo com os nomes dos livros dos livros
    for(int n = 0; n<numLinhas; n++){
        fprintf(titulo, "%s \n", nomeLivros[n]);
    }
    
    free(vetorMedias);
    //loop para liberar memoria matriz 
    for(int y = 0; y<numLinhas; y++){
        free(nomeLivros[y]);
    }
    
    fclose(entrada);
    fclose(titulo);
    fclose(estoque);

    
    
    
    return 0;
}

FILE * openFile(const char * file, const char * mode){
    FILE *fp;

    if((fp = fopen(file, mode)) != 0){
        return fp;
    }
    else{
        printf("Erro ao abrir o arquivo\n");
        return NULL;
    }
}

int contaLinhas(FILE *file){                 //contando quantidade de linahs no arquivo
    char c;
    char letra = '\n';                          // define o fim da linha
    int numLinhas = 0;                          //numero de numLinhas no arquivo 

    while(fread (&c, sizeof(char), 1, file)){
        if(c == letra) {                        //se a ultima letra for \n é porque a linha acabou, somando +1
            numLinhas++;                        //numero de linhas
        }
    } 
    numLinhas++;
    return numLinhas;
}

float calculaMedia(FILE * file){   
    char nome[MAX];
    float p1,p2,p3,p4,p5;
    float media;

    fscanf(file," %[^/]/ %f %f %f %f %f",nome,&p1,&p2,&p3,&p4,&p5);
    media = (p1+p2+p3)/5;

    return media;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Estalha disse:
FILE * openFile(const char * file, const char * mode);

 

Não entendi para que essa função, que é uma capa para ela mesma. ???? fopen() tem dois parâmetros e retorna um handle, o tal FILE*. Aí você escreveu uma função que faz exatamente a mesma coisa, com os mesmos argumentos,  e chamou de ... openFile()??

 

Também não entendi os especificadores de scanf(). Você pode e deve consumir uma linha por vez.

 

 /* LIVRO/       1  2  3  4  5 
/ outro livro /  1 34  5  6 89
/ livro2 /      12 22 33 44 55 
/ livrox /      21 23 44 55 66

 

A saída:

 

* LIVRO
outro livro
livro2
livrox


 

Se você quer a saída no modo texto escreva como tal. Veja o enunciado... que você não postou.

 

Isso é claro muito vago. Então se pode supor que vai acumular informações sobre os livros em estoque nos vários lugares e mostrar na tela, e ao final gerar um TXT com a simples lista dos livros. Assim você descreveu.

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!