Ir ao conteúdo

Posts recomendados

Postado

Olá, criei um código que salva em .txt as informações, porém quando eu digito tudo certinho no prompt e depois abro o bloco de notas está tudo em código morse, gostaria de saber se alguém sabe qual é o problema... É um trabalho semestral da faculdade. 

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<locale.h>
#include<string.h>
 
struct FeedCliente
{
    char  nome[200];
    char  cod [200];
    char  coment[200];
};

void titulo ();
void inputData();
void listar();
void pesquisar();

    
int main(){
    setlocale(LC_ALL, "Portuguese");
    int opcao;
    do{
        titulo();
        printf("1 - Cadastrar Feedback\n");
        printf("2 - Pesquisar pelo código\n");
        printf("3 - Listar Feedback's\n");
        printf("4 - Sair           \n\n");
        printf("Escolha uma das opções: ");
        scanf("%d", &opcao);
        
        switch (opcao){
            case 1:
                inputData();
            break;
            case 2:
                pesquisar();
            break;
            
            case 3:
                listar();
            break;
            
            case 4:
                printf("Obrigado por sua visita!!!\n");
                    getch();
            break;
            
            default:   
                printf("Opção inválida!!!\n");
                getch();
                     
            break;
             
        }
        
        
        
        
        
        
                    
}while(opcao != 4);
    
}

void titulo (){
    system("cls");
    printf("--------MENU DE FEEDBACK --------\n\n\n");

}

void inputData(){
   FILE* arquivo;
   FeedCliente fdb;
   
   arquivo = fopen("feedback.txt", "a");
   
   if(arquivo == NULL ){
       printf("Problema na abertura do arquivo!!!\n");
   }
   
   else{
          do{
                  titulo();
                  fflush(stdin);
                  printf("Digite o nome:   ");
               gets(fdb.nome);
               
               fflush(stdin);
                  printf("Digite o código:   ");
               gets(fdb.cod);
               
               fflush(stdin);
                  printf("Digite o comentário:   ");
               gets(fdb.coment);
               
               fwrite(&fdb, sizeof(FeedCliente), 1, arquivo);
               
               printf("Deseja continuar (s/n)?\n");
           
               
              
          }while (getche() == 's');
          fclose(arquivo);
          }
   }
   
   void listar(){
   FILE* arquivo;
   FeedCliente fdb;
   
   arquivo = fopen("feedback.txt", "r");
   
   titulo();
   if(arquivo == NULL ){
       printf("Problemas na abertura do arquivo!!!\n");
   }
   else{
        while(fread(&fdb, sizeof(FeedCliente), 1, arquivo)==1){
              printf("Nome: %s\n", fdb.nome);
              printf("Código: %s\n", fdb.cod);
              printf("Comentário: %s\n", fdb.coment);
              printf("------------------------------------------------------\n\n");
        }
       
   }
   fclose(arquivo);
   getch();
}
   void pesquisar (){
       FILE* arquivo;
       FeedCliente fdb;
       
       
       char  cod[100];
       
       titulo();
       arquivo = fopen("feedback.txt", "r");
       if(arquivo == NULL){
           printf("Problemas na abertura do arquivo!!!\n");
       }
       else{
           fflush(stdin);
           printf("Digite o código desejado: ");
           gets(cod);

           while(fread(&fdb, sizeof(FeedCliente), 1, arquivo)==1){
               if( strcmp (cod, fdb.cod)==0){
                   printf("Código: %s\n", fdb.cod);
                   printf("Nome: %s\n", fdb.nome);
                   printf("Comentário %s\n", fdb.coment);
                   printf("---------------------------------------------------------------\n");
                   
                   
               }
               }
               
               
               
           }
           
           
    
       fclose(arquivo);
       getch();
}
       
   
   
   
   
   
   
   
   
   
   

  • Curtir 1
Postado

@Crístofer Tartaglia    seu código está bom , mas para gravar no arquivo usando fwrite ,  que é para arquivo binário ,  precisa abrir o arquivo desse tipo , usando   "  ab  "  ,  e para abrir o arquivo  usando o fread , também binário ,  use  "  rb  " ,  e  precisa colocar o tipo de dado ,  que é struct ,  pois se você usasse o typedef , aí não precisaria colocar esse tipo struct ,  e então seu código com algumas modificações poderia ser assim    : 

#include <stdio.h>
#include <memory.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#define u GetStdHandle(STD_OUTPUT_HANDLE)
#define textcolor_2(l,f) SetConsoleTextAttribute(u,l+(f<<4));
#define Sleep(g) for(f=0;f<g*300000;f++);
struct FeedCliente{
    char  nome[200];
    char  cod [200];
    char  coment[200];
};
int f;
void titulo(   );
void inputData();
void listar(   );
void pesquisar();
int main(){
    setlocale(LC_ALL, "Portuguese");
    int opcao;
    do{
        titulo();
        textcolor_2(14,0);
        printf("1 - Cadastrar Feedback\n");
        printf("2 - Pesquisar pelo c%cdigo\n",162);
        printf("3 - Listar Feedback's\n");
        printf("4 - Sair           \n\n");
        printf("Escolha uma das op%c%ces: ",135,228);
        textcolor_2(11,0);
        scanf("%d", &opcao);
        switch (opcao){
        case 1:
            inputData();
            break;
        case 2:
            pesquisar();
            break;
        case 3:
            listar();
            break;
        case 4:
            textcolor_2(10,12);
            printf("\n  Obrigado por sua visita  \n\n");
            textcolor_2(0,0);
            printf("        ");
            textcolor_2(14,0);
            while( ! kbhit()){
                printf("|\b" );Sleep(100);
                printf("/\b" );Sleep(100);
                printf("-\b" );Sleep(100);
                printf("\\\b");Sleep(600);
            }
            break;
        default:
            printf("Op%c%co inv%clida!!!\n",135,198,160);
            getch();
            break;
        }
    }while(opcao != 4);
}
void titulo (){
    textcolor_2(12,0);
    system("cls");
    textcolor_2(12,14);
    printf("--------MENU DE FEEDBACK --------\n\n\n");
}
void inputData(){
   FILE* arquivo;
   struct FeedCliente fdb;
   arquivo = fopen("feedback.txt", "ab");/* b para usar fwrite " arquivo binário " */
   if(arquivo == NULL ){
       printf("Problema na abertura do arquivo!!!\n");
   }
   else{
        do{
            titulo();
            textcolor_2(14,0);
            fflush(stdin);
            printf("Digite o nome --------: ");
            textcolor_2(11,0);
            gets(fdb.nome);
            fflush(stdin);
            textcolor_2(14,0);
            printf("Digite o c%cdigo -----: ",162);
            textcolor_2(11,0);
            gets(fdb.cod);
            fflush(stdin);
            textcolor_2(14,0);
            printf("Digite o coment%crio -: ",160);
            textcolor_2(11,0);
            gets(fdb.coment);
            fwrite(&fdb, sizeof(struct FeedCliente), 1, arquivo);/* aqui precisa usar o tipo de dado   "struct" */
            printf("Deseja continuar (s/n)?\n");
        }while (getche() == 's');
        fclose(arquivo);
    }
}
void listar(){
    FILE* arquivo;
    struct FeedCliente fdb;
    arquivo = fopen("feedback.txt", "rb");/* b para usar fwrite " arquivo binário " */
    titulo();
    if(arquivo == NULL ){
        printf("Problemas na abertura do arquivo!!!\n");
    }
    else{
        textcolor_2(11,0);
        while(fread(&fdb, sizeof(struct FeedCliente), 1, arquivo)==1){/* aqui precisa usar o tipo de dado   "struct" */
            printf("Nome --------: %s\n",    fdb.nome  );
            printf("C%cdigo ------: %s\n",162,fdb.cod   );
            printf("Coment%crio --: %s\n",160,fdb.coment);
            printf("------------------------------\n\n");
        }
    }
    fclose(arquivo);
    getch();
}
void pesquisar (){
    FILE* arquivo;
    struct FeedCliente fdb;
    char  cod[100];
    titulo();
    arquivo = fopen("feedback.txt", "rb");/* b para usar fwrite " arquivo binário " */
    if(arquivo == NULL){
        printf("Problemas na abertura do arquivo!!!\n");
    }
    else{
        textcolor_2(14,0);
        fflush(stdin);
        printf("Digite o c%cdigo desejado: ",162);
        textcolor_2(11,0);
        gets(cod);
        while(fread(&fdb, sizeof(struct FeedCliente), 1, arquivo)==1){/* aqui precisa usar o tipo de dado   "struct" */
            if( strcmp (cod, fdb.cod) == 0                 ){
                printf("C%cdigo ------: %s\n",162,fdb.cod   );
                printf("Nome --------: %s\n", fdb.nome     );
                printf("Coment%crio --: %s\n",160,fdb.coment);
                printf("--------------------------------\n");
            }
        }
    }
    fclose(arquivo);
    getch();
}

 

Postado

Certo, vou explicar o que ocorreu, eu fui fazendo o código conforme uma video aula, e nessa vídeo aula era pra salvar em binário, porém nesse código que eu "criei" não quero que seja binário, como é que faz??? Vou mandar print de como está salvando no bloco de notas( precisa ser salvo normal pois utilizarei como se fosse um banco de dados em txt)

perigo.png

  • Obrigado 1
Postado

@KXSY entendi, mas eu queria adaptar para o meu código, acho que ficou muito bom e tal com o menuzinho, esse programa é para um projeto de pizzaria, então eu gostaria de mudar só a parte do fscanf, só que não sei como é a estrutura pra tirar o fwrite...

  • Curtir 1
Postado

Olá

 

Sua estrutura

struct FeedCliente
{
    char  nome[200];
    char  cod [200];
    char  coment[200];
};

 

é um registro para o arquivo. Cada fwrite() em seu programa vai gravar um troço desse, que tem tamanho fixo como está aí. Algo como uma linha com uns 600 caracteres. E nem é bem isso, porque cada linha teria um terminador, esse '\n' que aparece nos programas às vezes. E você não gravou. Por outro lado cada campo que você leu vai estar dentro desse limite de 200. Entrando "Qualquer Um" para nome tem menos que 200: tem 11. E um '\0' no fim indicando o fim da string, o tal null. E foi isso que você gravou no arquivo naquela área de 200 posições. E nem se preocupou com o resto até dar 200. E o bloco de notas não entende isso. Acho que deu para você entender. Você não preparou sequer aquela área toda para ficar por exemplo em branco antes de gravar. E mesmo assim tem o problema dos tais null ao final de cada campo.

 

O bloco de notas por outro lado considera texto de tamanho variável, apenas algumas letras e símbolos em linhas terminadas por esse tal newline, ou 10, ou '\n' ou LF ou CRLF dependendo do livro que está lendo e do sistema que está usando.

 

E dai?

 

Veja, gravei em arquivo struct.txt essa declaração da struct que está acima e abaixo está a representação disso no disco, para um arquivo que o bloco de notas entende: apenas texto, com 6 linhas como está acima

 

hex.thumb.png.2612c5b1d6048185d129ab430d2fbc43.png

 

Estou usando windows. Se usa Unix/Linux/MacOS tem o comando od --- Veja em man od --- bem mais versátil que meu pobre editor. Mas o layout é o mesmo: do lado esquerdo os bytes em hexadecimal, 16 por linha, e na coluna da direita os valores em texto, os mesmos 16 e vai ver sua struct lá.

 

O que importa é olhar os códigos: fora as letras, você vai ver só uns grupos de 0D 0A lá que são os tais newline, '\n\ ou 10 ou 0A mesmo. No Unix e derivados em geral vai ver apenas 0A que é 10, e não vai ver os 13, 0d em hexa que seria o grupo CRLF que no Linux é só LF.  Mas isso é lido de maneira portável e você só lê mesmo o 10 no windows também. 

 

E tem 5 grupos desses e aparecem mesmo uns caracteres estranhos do lado direito na posição deles. Só que isso o bloco de notas e os editores de texto entendem: fim de linha

 

Agora pense no seu caso de gravar 600 bytes por linha sem se preocupar com o que tem lá dentro adiante do que foi digitado e já entendeu que vai  gravar muito mais do que precisa. Por exemplo esse arquivo aí tem 93 bytes e 6 linhas apenas. Se fosse usar o seu formato teria 3600 ao menos.

 

Dois caminhos:

  • ou você grava assim e lê apenas através de seus programas, que vão saber o que está lá dentro
  • ou usa funções, como foi recomendado aqui, que gravam texto em formato variável e assim pode abrir depois também com o editor.

Só que aí depois é o diabo para editar no meio deles via programa, certo?

Mas acho que já sabe o que esperar em um caso e em outro.

 

Em 12/11/2019 às 19:22, Crístofer Tartaglia disse:

salvando no bloco de notas( precisa ser salvo normal pois utilizarei como se fosse um banco de dados em txt)

Gravar os registros com fwrite() não é anormal e gravar texto puro --- plain text --- não é normal. 

 

O que é um banco de dados em txt? Com linhas nome/cod/comment de tamanho variável até 200 bytes. Vai ter dificuldade em tratar isso. Num banco de dados provavelmente você indexaria isso tudo por uma chave, tipo o tal cod que não seria numérico...

 

Talvez possa explicar melhor o que está tentando fazer...

 

 

 

 

 

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!