Ir ao conteúdo
  • Cadastre-se
Samaroni Ramos Campelim

C Programa não apaga o conteúdo do arquivo

Posts recomendados

Boa tarde, estou implementado este programa em que leio 5 endereços do teclado e imprimo a pilha na tela e em um arquivo. Até aqui tranquilo o problema é que o conteúdo do arquivo não apaga quando adiciono novos endereços, ou seja ele imprime os novos endereços no arquivo mantendo junto com os já salvos, alguém tem uma ideia de como resolver?

OBS: já utilizei ''w'' no fopen para abrir o arquivo e dai ele imprime somente a primeira string no arquivo.

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

#define MAX 5
#define TAM 100

char pilha[MAX][TAM] = {0}; //pilha de 5 strings de 100 caracteres cada. Ou seja... podemos empilhar 5 objetos(frases) de até 100 letras cada. Isso contando com que MAX tenha um valor de 5 claro
int top = 0;

//Empilha um elemento até que a pilha esteja cheia. Se estiver cheia mostra um aviso"Pilha Cheia!"
void empilhar ( char endereco[TAM] ) {
    if ( top < MAX ) {
        strcpy ( pilha[top],endereco);
        top++;
    }else{
        printf("Erro: Pilha Cheia! Tentou empilhar \"%s\" na posicao %d que nao se permite.\n\n",endereco, MAX+1);
    }
}

//Imprime a pilha de abaixo para cima si a pilha não estiver vazia. Caso contrario, se a pilha estiver vazia, mostra "Pilha Vazia"
void imprimirPilha() {
    int i;
    FILE *pArq;

    if(top != 0){

        printf("Conteudo da pilha:\n");
        for ( i = top-1; i >= 0 ; i-- ) {
            printf ( "\"%s\"\n", pilha[i] );

            if((pArq = fopen("Historico.txt","a")) == NULL)
{
	printf("Erro ao abrir arquivo!!!\n");
	exit(1);
}


fprintf(pArq,"%s\n",pilha[i]);

fclose(pArq);

}
        }

    else{
        printf("Conteudo da pilha:\n");
        printf("Vazia!\n\n");
    }
}

//Desempilha um elemento. Caso não tenha nada mais que desempilhar mostra um aviso
void desempilhar() {
    int i;

    if ( top > 0 ) {
        printf("Desempilhar posicao %d da pilha. Continha \"%s\"\n\n", top, pilha[top-1]  );
        for ( i = 0; i < TAM ; i++ ) {
            pilha[top-1][i] = 0;
        }
        top--;
    }else{
        printf("Erro: Tentando desempilhar pilha vazia\n\n");
    }
}

int main() {
    char endereco[100];
    int i;

    for(i=0;i<MAX;i++){
    printf("Informe o endereco[%d]: ",i);
    gets(endereco);
    empilhar (endereco);
    }

    imprimirPilha();
    desempilhar();
    imprimirPilha();


}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dica... somente confira se o arquivo abriu uma só vez depois de abrir. E feche o arquivo justo depois de cada edição, só assim se guardarão as modificações que fizer no arquivo. A forma correta seria com w como modo mesmo:

void imprimirPilha() {
    int i;
    FILE *pArq;
    
    if ( ( pArq = fopen ( "Historico.txt", "w" ) ) == NULL ) {
        perror ( "Erro: " );
        getchar();
        exit ( 1 );
    }
    
    if ( top != 0 ) {
    
        printf ( "Conteudo da pilha:\n" );
        
        for ( i = top - 1; i >= 0 ; i-- ) {
            printf ( "\"%s\"\n", pilha[i] );
            fprintf ( pArq, "%s\n", pilha[i] );
        }
        
        fclose ( pArq );
        
    } else {
        printf ( "Conteudo da pilha:\n" );
        printf ( "Vazia!\n\n" );
    }
}

assim com w você reescreve o arquivo perdendo todo o anterior. Importante é NÃO ter o arquivo aberto em nehum editor, como por exemplo o notepad, eles pode impedir que se guardem as mudanças ao não permitir que outro programa manipule o arquivo ao mesmo tempo, existem editores que sim permitem, notepad++, codeblocks sim permitem, porém talvez seja necessário ativar alguma opção que permita a edição simultânea em múltiplos programas ao mesmo tempo. No codeblocks por exemplo pergunta se você quer recargar o arquivo. Já no notepad++ você precisa ativar:
Screenshot_2.png.8cec1a30bcf14c2c784164333c51fde6.png

Com isso notepad++ não bloqueia o arquivo. Com isso tudo vemos que o tradicional notepad.exe não serve para programar.

Seu programa depois de uns retoques ficaria assim:
 

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

#define MAX 5
#define TAM 100

char pilha[MAX][TAM] = {0}; //pilha de 5 strings de 100 caracteres cada. Ou seja... podemos empilhar 5 objetos(frases) de até 100 letras cada. Isso contando com que MAX tenha um valor de 5 claro
int top = 0;

//Empilha um elemento até que a pilha esteja cheia. Se estiver cheia mostra um aviso"Pilha Cheia!"
void empilhar ( char endereco[TAM] ) {
    if ( top < MAX ) {
        strcpy ( pilha[top], endereco );
        top++;
    } else {
        printf ( "Erro: Pilha Cheia! Tentou empilhar \"%s\" na posicao %d que nao se permite.\n\n", endereco, MAX + 1 );
    }
}

//Imprime a pilha de abaixo para cima si a pilha não estiver vazia. Caso contrario, se a pilha estiver vazia, mostra "Pilha Vazia"
void imprimirPilha() {
    int i;
    FILE *pArq;
    
    if ( ( pArq = fopen ( "Historico.txt", "w" ) ) == NULL ) {
        perror ( "Erro: " );
        getchar();
        exit ( 1 );
    }
    
    if ( top != 0 ) {
    
        printf ( "Conteudo da pilha:\n" );
        
        for ( i = top - 1; i >= 0 ; i-- ) {
            printf ( "\"%s\"\n", pilha[i] );
            fprintf ( pArq, "%s\n", pilha[i] );
        }
        
        fclose ( pArq );
        
    } else {
        printf ( "Conteudo da pilha:\n" );
        printf ( "Vazia!\n\n" );
    }
}

//Desempilha um elemento. Caso não tenha nada mais que desempilhar mostra um aviso
void desempilhar() {
    int i;
    
    if ( top > 0 ) {
        printf ( "Desempilhar posicao %d da pilha. Continha \"%s\"\n\n", top, pilha[top - 1] );
        
        for ( i = 0; i < TAM ; i++ ) {
            pilha[top - 1][i] = 0;
        }
        
        top--;
    } else {
        printf ( "Erro: Tentando desempilhar pilha vazia\n\n" );
    }
}

int main() {
    char endereco[100];
    int i;
    bool dadosTeclado = false; // True si queremos ler desde o teclado. False si queremos usar um caso de teste automatico. Muito melhor para fazer provas.
    char lista[5][100] = {
        {"dir1"},
        {"dir2"},
        {"dir3"},
        {"dir4"},
        {"dir5"}
    };
    
    if ( dadosTeclado == true ) {
    
        for ( i = 0; i < MAX; i++ ) {
            printf ( "Informe o endereco[%d]: ", i );
            gets ( endereco );
            empilhar ( endereco );
        }
    } else {
        for ( i = 0; i < MAX; i++ ) {
            printf ( "Endereco automatico[%d]: ", i );
            printf("%s\n", lista[i]);
            strcpy(endereco, lista[i]);
            empilhar ( endereco );
        }
    }
    
    imprimirPilha();
    desempilhar();
    imprimirPilha();
    
    
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!