Jump to content
Fórum Script Brasil
  • 0

Gravar Arquivo em C.


Nai

Question

Oláá, bom dia pessoal! :}

To fazendo exercícios de programação desde ontem, e eu empaquei nesse e não consigo sair.. Meu professor não chegou na matéria de ponteiros, e minha noção sobre arquivos em linguagem C tá muito confusa porque cada hora leio uma coisa diferente!

Pesquise e construa um software que grave um “arquivo texto”. O software deverá ter em seu menu três opções:

i. Gravar Arquivo

• Caso esta opção seja escolhida, então seu software deverá solicitar que o usuário digite uma frase de no

máximo 100 caracteres.

• O software gravará esta frase num arquivo texto (arquivo este criado pelo próprio software).

• Após a gravação, o usuário deverá ser remetido ao menu.

ii. Ler Arquivo

• Ao ser escolhida esta opção, o software deverá exibir na tela a frase anteriormente digitada pelo usuário

e que tenha sido gravada no arquivo texto.

• Após um <Enter>, o usuário deverá ser remetido ao menu principal.

iii. Sair

• Ao ser escolhida esta opção, o programa deverá ser finalizado.

Eu comecei a fazer, olhando com exemplos, mas tá dando erro O.o

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

int main()
{
    
    FILE *fp;
    int menu, i;
    char digitado[100];
    FILE *fopen(char "frase.txt", char*w );

    do
    {
        do
        {
            printf("Menu de opcoes:\n\n");
            printf("1 - Gravar Arquivo ");
            printf("2 - Ler Arquivo");
            printf("3 - Sair");
            scanf("%d",&menu);

        }while((menu<1) || (menu>3));
        
        if(menu==1)
        {
            printf("Digite uma frase:\n");
            gets(digitado);
            for(i=0;i<100; i++)
            {
            putc(digitado[i], fp); 
            }
        }
        
        if(menu==2)
        {
            //Não tenho a menor idéia de como fazer isso O.o
            
        }
        
        
        
    }while(menu!=3);

    fclose(frase);
     
    return 0;
}

Edited by Nai
Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Opa,

Eu fiz aqui rapidinho, testei e o melhor de tudo.... está funcionando.Espero que possa ter ajudado vc. Feliz Natal!!!

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


struct frase
{
    char nome[100];  
};

 //função grava
   void grava(struct frase a[100],int fim)
  {
      FILE *arq;
      int teste,i;
      arq = fopen("arquivo.txt","wb"); 
       if(arq != NULL)
       {
          for(i=0;i<fim;i++)
          {
              teste = fwrite(&a[i],sizeof(struct frase),1,arq);
              if (teste !=1) 
              {
                 printf("erro ao salvar"); 
                 getch();                 
              }
          } 
            fclose(arq); 
       }  
          else 
          {         
             printf("erro ao abrir arquivo");
          }  
  }       
       
 //função carrega     
 int carrega(struct frase a[100])  
 {
    FILE *arq;  
    int teste,percorre=0;
    struct frase registro;
      
    arq = fopen("arquivo.txt","rb"); 
    if(arq != NULL) 
    {
       while (!feof(arq)) 
       {
             teste = fread(&registro,sizeof(struct frase),1,arq);      
             if (teste ==1) 
             { 
                a[percorre] = registro;     
                percorre++;        
             }
       }    
           fclose(arq);             
    }        
      return percorre; 
              
}          
     
  int main() 
 {
   struct frase vet[100]; 
        
   int ultimo=0,i,op=0;
            
      while(op !=3) 
      {    
           ultimo = carrega(vet); //abre arquivo e carrega para o vetor 
           printf ("======================================MENU===============================\n");
           printf ("1 - Grava Arquivo :\n");
           printf ("2 - Ler Arquivo :\n");
           printf ("3 - Sair:\n");
           fflush (stdin);
           scanf ("%d",&op);    
           fflush (stdin);   

           if(op==1)
           {
              printf("Informe Frase:");      
              fflush(stdin);
              fgets (vet[ultimo].nome,100,stdin);
              fflush(stdin);           
              ultimo++;
              grava(vet,ultimo); //função para gravar vetor no arquivo .txt
              printf("\n");
              printf("Cadastro Realizado com sucesso !\n\n");
              system("pause");
              system("CLS");
           }  
              
     
          if(op==2)
          { 
                if (ultimo == 0){ // senao não existe nada no arquivo, mostra mensagem abaixo
                    printf("Nenhuma frase foi cadastrada ainda.Favor verificar!\n");
                    printf("\n");}          
                
               else{ 
                         for(i=0;i<ultimo;i++){        
                         printf("=================================\n");
                         printf("nome = %s\n",vet[i].nome);}
                         
                    }   
          }
            
              
           if(op==3){
              printf("Encerrando o programa com sucesso!\n\n");
              system("pause");
              exit(0);}
    
      }//while         
    }//main

1) Criei duas funções (grava, carrega), uma para gravar a frase dentro do arquivo.txt, e a outra para ler os dados do arquivo.Ambas em cima do main.

2) Criei um vetor de 100 posições para você inserir suas frases;

3) Criei uma estrutura do tipo frase, para armazenar suas frases;

Edited by Prog_Junior
Link to comment
Share on other sites

  • 0
Opa,

Eu fiz aqui rapidinho, testei e o melhor de tudo.... está funcionando.Espero que possa ter ajudado vc. Feliz Natal!!!

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


struct frase
{
    char nome[100];  
};

 //função grava
   void grava(struct frase a[100],int fim)
  {
      FILE *arq;
      int teste,i;
      arq = fopen("arquivo.txt","wb"); 
       if(arq != NULL)
       {
          for(i=0;i<fim;i++)
          {
              teste = fwrite(&a[i],sizeof(struct frase),1,arq);
              if (teste !=1) 
              {
                 printf("erro ao salvar"); 
                 getch();                 
              }
          } 
            fclose(arq); 
       }  
          else 
          {         
             printf("erro ao abrir arquivo");
          }  
  }       
       
 //função carrega     
 int carrega(struct frase a[100])  
 {
    FILE *arq;  
    int teste,percorre=0;
    struct frase registro;
      
    arq = fopen("arquivo.txt","rb"); 
    if(arq != NULL) 
    {
       while (!feof(arq)) 
       {
             teste = fread(®istro,sizeof(struct frase),1,arq);      
             if (teste ==1) 
             { 
                a[percorre] = registro;     
                percorre++;        
             }
       }    
           fclose(arq);             
    }        
      return percorre; 
              
}          
     
  int main() 
 {
   struct frase vet[100]; 
        
   int ultimo=0,i,op=0;
            
      while(op !=3) 
      {    
           ultimo = carrega(vet); //abre arquivo e carrega para o vetor 
           printf ("======================================MENU===============================\n");
           printf ("1 - Grava Arquivo :\n");
           printf ("2 - Ler Arquivo :\n");
           printf ("3 - Sair:\n");
           fflush (stdin);
           scanf ("%d",&op);    
           fflush (stdin);   

           if(op==1)
           {
              printf("Informe Frase:");      
              fflush(stdin);
              fgets (vet[ultimo].nome,100,stdin);
              fflush(stdin);           
              ultimo++;
              grava(vet,ultimo); //função para gravar vetor no arquivo .txt
              printf("\n");
              printf("Cadastro Realizado com sucesso !\n\n");
              system("pause");
              system("CLS");
           }  
              
     
          if(op==2)
          { 
                if (ultimo == 0){ // senao não existe nada no arquivo, mostra mensagem abaixo
                    printf("Nenhuma frase foi cadastrada ainda.Favor verificar!\n");
                    printf("\n");}          
                
               else{ 
                         for(i=0;i<ultimo;i++){        
                         printf("=================================\n");
                         printf("nome = %s\n",vet[i].nome);}
                         
                    }   
          }
            
              
           if(op==3){
              printf("Encerrando o programa com sucesso!\n\n");
              system("pause");
              exit(0);}
    
      }//while         
    }//main
1) Criei duas funções (grava, carrega), uma para gravar a frase dentro do arquivo.txt, e a outra para ler os dados do arquivo.Ambas em cima do main. 2) Criei um vetor de 100 posições para você inserir suas frases; 3) Criei uma estrutura do tipo frase, para armazenar suas frases;
Agradeço de verdade tudo o que você fez, mas a maioria do que você fez são comandos que não posso utilizar, de acordo com meu professor... Eu cheguei a montar outro:
#include <stdio.h>
#include <stdlib.h>

int main()
{

    FILE *ponteiro;
    int menu, i;
    char digitado[100];

    do
    {
        do
        {
            printf("\nMenu de opcoes:\n\n");
            printf("1 - Gravar Arquivo \n");
            printf("2 - Ler Arquivo\n");
            printf("3 - Sair\n");
            scanf("%d",&menu);

        }while((menu<1) || (menu>3));

        if(menu==1)
        {
            printf("Digite uma frase:\n");
            fflush(stdin);
            gets(digitado);
            ponteiro = fopen("Teste.txt", "w");
            fprintf(ponteiro, "%s", digitado );
            fclose(ponteiro);
            i=0;
        }

        if(menu==2)
        {
            ponteiro = fopen("Teste.txt", "r");
            if(ponteiro==NULL)
            {
                printf("não existe nenhum arquivo.\n\n");
            }
            else
            {
            fscanf(ponteiro,"\n%s\n", digitado);
            printf("Abertura e leitura de arquivo realizada com sucesso.\n\n");
            puts(digitado);
            fclose(ponteiro);
            i=0;
            }
        }



    }while(menu!=3);


    return 0;
}

O seguinte erro acontece: quando eu peço pra imprimir na tela a string digitado só aparece a primeira palavra. não faço idéia de aonde está o erro...

Link to comment
Share on other sites

  • 0

/*

Criado utilizando CodeBlocks versão 10.05
Compilado e testado no Windows XP 32 bits pt-br

Programa criado para fins didáticos e publicado
em 06/12/2011 em http://scriptbrasil.com.br

Contato:fabiano[ponto]dolabela[em]gmail[ponto]com - www.devgrid.info

Obs.: Uma vez que não foi especificado, alguns dos erros decorrentes
de entradas erradas por parte do usuário não foram tratados.

Para ser compilado em ambiente Linux, será necessário instalar a biblioteca
ncurses.

*/

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

//Tamanho máximo da frase
#define MAX 101


//Protótipo das funções
int menu();
void LimpaTela();
void GravaArquivo();
void LeArquivo();


int main(){

    int resposta = 0;

    //Chama a função do menu
    do{
        resposta = menu();
    }while(resposta != 3);


    return(0);
}


void LimpaTela(){

    #ifdef WINDOWS
    system("CLS");
    #elif defined(WIN32)
    system("CLS");
    #elif defined(linux)
    system("clear");
    #elif defined(CYGWIN32)
    system("clear");
    #endif
}

//Função com o menu do programa e chamada
//para as demais funções
int menu(){

    unsigned char escolhe_menu = 00;

    do{
        LimpaTela();
        printf("\n\nPROGRAMA GRAVA E LE ARQUIVO\n\n");
        printf("(1)Gravar Arquivo\n");
        printf("(2)Ler Arquivo\n");
        printf("(3)Sair");
        escolhe_menu = getch();

    }while(escolhe_menu != 49 && escolhe_menu != 50 && escolhe_menu != 51);

    switch (escolhe_menu){

        case 49:

            GravaArquivo();

            break;

        case 50:

            LeArquivo();

            break;

        case 51:

            return(3);

            break;

        default:

            //Corre é uma cilada bino!!!
            exit(1);
    }


    return(0); //Para fins de teste

}

//Cria e/ou grava em um arquivo existente
void GravaArquivo(){

    char frase_entrada[MAX];

    FILE *arquivo_gravacao;


    //Entrada da frase a ser gravada no arquivo
    do{
        printf("\n\nDigite a frase a ser gravada: ");
        fgets(frase_entrada,MAX,stdin);
    }while(strlen(frase_entrada ) <= 2);

    //Só abre o arquivo se tiver algo pra gravar;
    if (strlen(frase_entrada ) >= 3){
        arquivo_gravacao = fopen("frase.txt","a");
        fprintf(arquivo_gravacao,"%s",frase_entrada);
        fclose(arquivo_gravacao);
    }

}

//Lê o arquivo anteriormente criado
//Favor observar que não há tratamento
//para o caso do arquivo não existir
void LeArquivo(){

    char frase_saida[MAX];
    unsigned char pausa = 00;
    FILE *arquivo_leitura;


    //Obs.: não há tratamento de erro caso o arquivo
    //      não exista.

    arquivo_leitura = fopen("frase.txt","r");

    printf("\n\nO conteudo do arquivo e:\n\n");

    while(fgets(frase_saida,MAX,arquivo_leitura) != NULL){
        printf("%s",frase_saida);
    }
    fclose(arquivo_leitura);

    //Pausa pra leitura
    printf("\n\n\n\n\nPRESSIONE <ENTER> PARA RETORNAR AO MENU PRINCIPAL");
    do{
        pausa = getch();
    }while(pausa != 13);
}

Espero que resolva o seu problema!

Link to comment
Share on other sites

  • 0

Opa, pelo o que eu vi ali você tem uma variavel char digitado[100]... Isso significa que você pode armazenar apenas um nome no maximo dentro dessa variavel contendo até 100 caracters(strings). Toda vez que você gravar outro nome nela, irá apagar o existente e sobrescrever.Por isso que aparece sempre o ultimo nome gravado e não os outros existentes. Para resolver isso, eu criei uma struct e um vetor de structs, para evitar esse problema.

Caso você não possa utilizar structs nesse exercicio, você precisara criar uma matriz de char.

Exemplo1:

digitado[100][100] - onde terá no maximo 100 caracteres e podera ter até 100 registros gravados dentro da matriz.
Exemplo2:
digitado[0][100] = "Joao"
digitado[1][100] = "Maria"
digitado[2][100] = "Jose"
digitado[3][100] = "Paulo"
.....

Acho que o caminho é esse!.

Edited by Prog_Junior
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...