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

Erro em manipulação de dados


filipeprogamador

Pergunta

Estou aprendendo Cem manipulação de dados,e no código da um erro que o progama mostra caracteres estranhos,o objetivo é fazer um software que manipula arquivos .txt

<code>
#include <stdio.h>
#include <stdlib.h>
FILE* abertura(char modo, char caminho[30]){//Está função de abertura do arquivo,a variavel modo,pode ser g,a,r e a caminho com 30 posições sera o caminho do arquivo que sera aberto
//A função tem que ser FILE pois vai retornar o arquivo(ponteiro)
FILE *arquivo;
switch(modo){//Vai verificar o modo
case 'g':
arquivo = fopen(caminho , "wt");
break;
case 'l':
arquivo = fopen(caminho ,"rt");
break;
case 'a':
arquivo = fopen(caminho , "a");
break;
}
/*
G - É para gravação,o parametro wt
a - É para append(anexação)
l - É para leitura do texto
*/
if(arquivo == NULL){//A diretiva NULL em letras maiusculas,é quando a pontar para o espaço da memoria NULO,ou NULL,caso o arquivo não exista
printf("Desculpe!\nO arquivo não foi encontrado.");
exit(0);
}
return arquivo;
}
void finalizar(FILE *arquivo){//Está função vai fechar
fclose(arquivo);
}
int main(){
return 0;
}

</code>

Será que é por que tem que estar em um documento C++

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

não precisa estar em C++. Porem si você esta aprendendo C++ essa não é a forma estândar de fazê-lo em C++, essa forma pertence a C.

Não tem problema usar, mesmo sendo de C, tudo depende de muitos fatores, C++ contem uma melhor gestão para os streams, por isso é melhor usar a forma de C++ si estiver em C++. Outro fator por exemplo é si nós estamos trabalhando num grupo de programadores, todos devem se por de acordo de que forma vão trabalhar, pelo que sempre é bom conhecer as duas formas padrões.

Si é para sigo mesmo, sem intervenções externas de preferencias, acho que fica ao critério do próprio programador usar ou não uma ou outra forma conforme seu gosto.

Deixo um exemplo funcional ligeiramente adaptado para manejo de excepções.

#include <stdio.h>
#include <ctype.h>   // para tolower


FILE* fileManager(){
    FILE* arquivo;
    char modo;  //opção
    char* nomeArquivo = "prova.txt";
    
    printf("Escolha um modo para abrir o arquivo \n\nG-Escritura \nL-Leitura \nA-Anexão \n\n?: ");
    scanf("%c%*c", &modo);
    modo = tolower(modo); //<-pasamos a minuscula 
    
    switch ( modo ) { //Vai verificar o modo
        case 'g':
            //G - É para gravação,o parametro wt
            arquivo = fopen ( nomeArquivo, "wt" ); //Só permite escrever no arquivo, borra conteudo anterior
            break;
            
        case 'l':
            //l - É para leitura  do texto
            arquivo = fopen ( nomeArquivo, "r" ); //modo leitura, no hace falta poner t, por default já é t, si não por b(binario), começa do principio.
            break;
            
        case 'a':
            //A- É para append(anexação)
            arquivo = fopen ( nomeArquivo, "a" ); //Modo Anexar só permite escrever ao fin do arquivo, não importa si tentar mover o descriptor de arquivo, sempre vai anexar ao fin evitando borrar conteudo.
            break;
    }
    

    if ( arquivo == NULL ) { //A diretiva NULL em letras maiusculas,é quando a pontar para o espaço da memoria NULO,ou NULL,caso o arquivo não exista
        perror("Desculpe! "); //<-importante para saber que tipo de erro tivemos ao tentar abrir
        
        //fazemos uma pausa
        printf("\nPulse uma tecla para continuar...");
        scanf("%*c");
        
        //como não conseguimos abrir o arquivo retornamos NULL que no apunta a nada.
        return NULL;
    }else{  
        //Si conseguimos abrir informamos do exito.
        printf("O arquivo %s esta aberto em modo %s\n", nomeArquivo, (modo=='g')? "gravação.":(modo=='a')? "anexão.": "leitura."  );
    }
    
    //Si chegamos aqui é por que o arquivo esta aberto e agora retornamos ele como foi pedido.
    return arquivo;
}//FIN fileManager

void finalizar ( FILE *arquivo ) { //Está função vai fechar o arquivo
    fclose ( arquivo );
}//FIN finalizar


//////MAIN////////
int main() {
    FILE* arquivo = fileManager(); //a variavel arquivo recebe o ponteiro ao arquivo.

    if( arquivo == NULL ){
        return 1; // si o programa retornar 1 é por que não abrio o arquivo não temos por que fechar ele, saimos aqui mesmo.
    }


    finalizar(arquivo); // si passou pela comprovaçao anterior é preciso fechar o arquivo antes de sair já que não vamos fazer mais nada.
    return 0;
}//FIN MAIN
Editado por vangodp
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
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...