Ir para conteúdo
Fórum Script Brasil
  • 0

Gravar Arquivo em C.


Nai

Pergunta

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;
}

Editado por Nai
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 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;

Editado por Prog_Junior
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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!.

Editado por Prog_Junior
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...