Ir ao conteúdo
  • Cadastre-se

C FIZ UM PROGRAMA PRA SALVAR EM .TXT, porém está salvando em codigo morse


Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

@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();
}

 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

Testa esse aqui

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

/* Constantes */
#define TAM 50

int main(void)
{
  FILE *arq=fopen("Nada.txt","w+");
  char frase[TAM];
  if(!arq)    /* Erro */
    return(-1);
  printf("\nDigite uma frase:\t");
  fgets(frase,TAM,stdin);
  fprintf(arq,"%s",frase);
  fclose(arq);
}

 

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

@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
Link para o comentário
Compartilhar em outros sites

@Crístofer Tartaglia Eu fiz dois exemplos simples, é só seguir para compreender.

Grava as informações no arquivo

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

/* Constantes */
#define T_NOME 10
#define Q_PRODUTOS 3
#define N_ARQUIVO "produtos.txt"

/* Tipos */
typedef struct
{
  char nome[T_NOME];
  float preco;
}TProduto;

int main(void)
{
  TProduto produtos[Q_PRODUTOS];
  int d;
  FILE *arq;
  /* Pega os produtos */
  for(d=0; d<Q_PRODUTOS; d++)
  {
    printf("\nDigite o nome do produto:\t");
    fgets(produtos[d].nome,T_NOME,stdin);
    printf("\nDigite o preço do produto:\t");
    scanf("%f",&produtos[d].preco);
    getchar();
  }
  /* Abre o arquivo */
  arq=fopen(N_ARQUIVO,"w+");
  if(!arq)    /* ERRO */
    return(2);
  /* Coloca no arquivo */
  for(d=0; d<Q_PRODUTOS; d++)
    fprintf(arq,"%s%.2f\n",produtos[d].nome,produtos[d].preco);
  fclose(arq);
  return(0);
}

Lê as informações do arquivo.

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

/* Constantes */
#define T_NOME 10
#define Q_PRODUTOS 3
#define N_ARQUIVO "produtos.txt"

/* Tipos */
typedef struct
{
  char nome[T_NOME];
  float preco;
}TProduto;

int main(void)
{
  TProduto produtos[Q_PRODUTOS];
  int d;
  /* Abre o arquivo */
  FILE *arq=fopen(N_ARQUIVO,"r+");
  /* Pega os produtos do arquivo */
  for(d=0; d<Q_PRODUTOS; d++)
  {
    fgets(produtos[d].nome,T_NOME,arq);
    fscanf(arq,"%f%*c",&produtos[d].preco);
  }
  /* Mostra na tela */
  for(d=0; d<Q_PRODUTOS; d++)
    printf("\nNome:%sPreco:\t%.2f",produtos[d].nome,produtos[d].preco);
  /* Fecha o arquivo */
  return(0);
}

Rode o primeiro e depois o segundo para ver o resultado.

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

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

 

 

 

 

 

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