• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zedblade

Pff ajuda para Files!

6 mensagens neste tópico

Boas tou no fim de um projecto de ficheiros em c, que uma boa parte ja esta terminada com toda a estrutura desenvolvida e com o executavel, embora tenha um problema numa parte do programa! É o seguinte, na parte da substituição de uma palavra por outra ao ler num ficheiro não consigo escrever essa nova palavra nesse msm ficheiro, ou seja inserimos a palavra que queremos substituir pela palavra que não queremos!!! outro problema que encontro é o caso k no sub menu a função nao sai para o menu principal '4' deixo o código para perceberem melhor!

Agradeço ajudas!!!

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

void menu(char nome[100]);
int main (int argc, char * const argv[]) 
{
    FILE *fp;
char nome[100];
char op;


do{
    system("cls");
    
    printf("\t\t\t*********************************\n\t\t\t*\t MENU PRINCIPAL\t\t*\n\t\t\t*********************************\n\n");
    printf("\t\t\t1--> Abrir ficheiro existente\n");
printf("\t\t\t2--> Criar um ficheiro\n"); 
printf("\t\t\t3--> Sair\n");
op=getchar();
    switch (op)
{

	case '1':   {
				printf("Digite o diretorio com o nome do ficheiro: ");
				scanf("%s",nome);
			    fp = fopen(nome, "rw");
				if (fp==NULL)
				{
					printf("\nErro!!");
					system("pause");
					system("cls");
				}else 
				{
					menu(nome);
				}
                    }
	case '2':{	
				printf("\nDigite o directorio com o nome do ficheiro a ser criado: ");
				scanf("%s",nome);
				fp = fopen(nome, "w");
				if (fp==NULL)
                {
                printf("\nErro!! Directorio errado! ");
                return 0;
                    }else{
				printf("\nFicheiro criado com successo! ");}
				system("pause");              
                }        
}
    }while(op!='3');
    return 0;
}

void menu(char nome[100])
{
char resp[2],op[2],car[10],nom[10],aux[2];
int flag;
FILE *fp;
system("cls");
do{
   printf("\n\t\t\t1--> Imprimir dados do ficheiro\n");
   printf("\n\t\t\t2--> Inserir dados no ficheiro\n"); 
   printf("\n\t\t\t3--> Procurar/Substituir\n");
   printf("\n\t\t\t4--> Sair\n");	
   op[2]=getchar();
       if (op[2]=='1')
       {        
                 fp = fopen(nome, "r");
             if (fp==NULL)
             {
                printf("\nErro!!");
                return 0;
                 }  
                 while (!feof(fp)) 
   	         {
                    fscanf(fp,"%s", car);
                    puts(car);
                 }
            fclose(fp); 
            system("pause");
       }
       if (op[2]=='2')
       {
          fp = fopen(nome,"a");
      if (fp==NULL)
      {
         printf("\nErro!!");
         return 0;
          }               
          printf("Introduza a palavra a acrecentar no ficheiro: ");
          //i=0;
          fprintf(fp,"\n");
          getchar();
          do
          {
              aux[2]=getchar();
              if (aux[2]!='\n')
              {
                 fprintf(fp,"%c",aux[2]);
              }             
          }while (aux[2]!='\n');
          
          fclose(fp);
       }
       if (op[2]=='3')
       {
          flag=0;
          printf("\nDigite a palavra a encontrar: ");
          scanf("%s",nom);
          fp = fopen(nome, "r+");
          if (fp==NULL)
          {
             printf("\nErro!!");
             return 0;
          }  
          while (!feof(fp)) 
          {
                fscanf(fp,"%s", car);
                if (strcmp(car,nom)==0)
                {
                   printf("\nPalavra encontrada! Deseja substituir(s/n): ");
                   getchar();
                   resp[2]=getchar();
                   flag=1;
                   if (resp[2]=='s')
                   {
                      printf("\nDigite a nova palavra: ");
                      getchar();
                      do
                      {
                        aux[2]=getchar();               /* zona que 
                                                            nao esta a 
                                                                    funcionar*/
                        if (aux[2]!='\n')
                        {
                         fprintf(fp,"%c",aux[2]);
                        }             
                      }while (aux[2]!='\n');//' '
                   }
                }
          }
          if (flag==0) {printf("\nA palavra nao existe ");}
          fclose(fp);
          system("pause");
          system("cls");
       }
       system("cls");
}while (op[2]!='4');// erro nao sai para o menu principal
 return 0;
  
}

cumps_zedblade_ :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vejo aí dois problemas:

- porque estás a declarar as variáveis resp, op, e aux como arrays de 2 posições?

char resp, op, aux;

era suficiente, porque só lá vais colocar um caracter.

- ignorando o ponto anterior, tens por exemplo declarado char op[2];, que como disse é um array de 2 posições. A primeira posição de um array é acedida com [ 0 ], pelo que com op[2] estás a escrever na posição 3 do array, que já não pertence ao espaço de memória deste. Pode ser esta a causa de não voltar ao menu principal (embora não tenha chegado a essa conclusão só de olhar para o código...)

Já agora uma sugestão: usa um switch em vez dos ifs seguidos quando decides qual a opção escolhida.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Enquanto ao modo de declarar as variaveis resp, op, aux como array é indiferente, visto que ja experementei dessa maneira e o resultado era o mesmo ou seja voltava á mensagem:  printf("\nDigite o directorio com o nome do ficheiro a ser criado: "); em vez do menu principal!!!

Ainda não sei o método mais eficiente para substituir uma palavra existente por uma nova... não tenho a certeza o que devo utilizar para substituir esta parte

if (resp[2]=='s')

                  {

                      printf("\nDigite a nova palavra: ");

                      getchar();

                      do

                      {

                        aux[2]=getchar();              /* zona que

                                                            nao esta a

                                                                    funcionar*/

                        if (aux[2]!='\n')

                        {

                        fprintf(fp,"%c",aux[2]);

                        }           

                      }while (aux[2]!='\n');//' '

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é indiferente porque estás a reservar o dobro do espaço necessário, e ainda mais grave, quando escreves estás a fazê-lo fora do espaço das variáveis.

Quanto ao dar essa mensagem quando seleccionas 4... é só colocares um break imediatamente antes do case '2'.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No caso do Break; ja esta resolvido, mas na situação das variaveis ja tentei dessa maneira, nao sera da estrutura definida, ou do fprintf??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Trabalhar directamente no ficheiro torna-se complicado e ineficiente. Penso que quando abres o ficheiro devias ler todas as palavras para um array de char*, e trabalhar sobre esse array, fazendo as procuras e substituições necessárias no array, e no final passar o seu conteúdo para o ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora