Jump to content
Fórum Script Brasil
  • 0

Erro em manipulação de dados


filipeprogamador
 Share

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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
Edited by vangodp
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.

 Share



  • Forum Statistics

    • Total Topics
      150.1k
    • Total Posts
      647.1k
×
×
  • Create New...