Tratamento de erros em C ++ ao abrir um arquivo

Quando você abre um arquivo, todos os tipos de coisas podem dar errado. Um arquivo vive em um dispositivo físico - um disco fixo, por exemplo, ou talvez em um cartão flash drive ou SD - e você pode ter problemas ao trabalhar com dispositivos físicos.

Por exemplo, parte do disco pode ser danificado, fazendo com que um arquivo existente para se tornar corrompido. Ou, menos desastrosa, você pode ficar sem espaço em disco. Ou, ainda menos desastrosa, que você pode tentar abrir um arquivo em um diretório que não existe.

Se você tentar abrir um arquivo para gravação, especificando um caminho completo e nome, mas o diretório não existe, o computador reage de maneira diferente, dependendo do sistema operacional que você está usando. Se você está inseguro sobre como seu sistema operacional em particular irá responder, tente escrever um aplicativo de teste simples que tenta criar e algo aberto como /abc/def/ghi/jkl/abc.txt. (Claro, você vai querer ter a certeza de usar um diretório que não existe.)

Em seguida, uma das duas coisas vai acontecer: ou o diretório e o arquivo irá ser criada, ou nada acontecerá.

Por exemplo, em um sistema Windows, se tentar criar um arquivo em um diretório que não existe, o sistema não cria o directório. Isso porque no fundo, a aplicação em última análise, chama uma função do sistema operacional que faz o trabalho sujo de criar o arquivo. E esta função sistema operacional específico (ele é chamado CreateFile (), se você mesmo cuidado) tem uma regra que não irá criar um diretório para você.

Se você quiser determinar se o ostream classe não conseguiu criar um arquivo, você pode chamar a sua falhou() função de membro. Esta função retorna verdade se o objeto não pôde criar o arquivo. E isso é o que acontece quando um diretório não existe. o DirectoryCheck01 exemplo mostrado demonstra um exemplo deste.

#incluir #incluir usando namespace std-int main () {outfile ofstream ( "/ abc / def / ghi / MyFile.txt") - se (outfile.fail ()) {cout lt; lt; "Não foi possível abrir o arquivo!" lt; lt; endl-retorno 0-} outfile lt; lt; "Oi" lt; lt; endl-outfile.close () - retorno 0-}

Quando você executar este código, supondo que você não tem um diretório chamado / Abc / def / ghi em seu sistema, você deverá ver a mensagem Não foi possível abrir o arquivo! Assumindo que o seu sistema operacional em particular não cria um diretório neste caso- Se isso acontecer, o computador irá abrir o arquivo, escrever Oi para ele, e seguir em frente com a sua vida feliz depois de fechar as coisas.

Como uma alternativa para chamar a falhou() função de membro, você pode usar um operador disponível em várias classes de fluxo. Este é!, Carinhosamente conhecido como o # 147-bang # 148- operador, e você iria utilizá-lo no lugar de chamar falhou(), como neste código:

if (! outfile) {cout lt; lt; "Não foi possível abrir o arquivo!" lt; lt; endl-retorno 0-}

A maioria das pessoas preferem usar !outfile ao invés de outfile.fail (), Apesar !outfile torna o código confuso. A razão é que outfile é um objeto, e a noção de !outfile simplesmente não faz sentido.

De fato, !outfile viagens até muitos programadores iniciantes. Eles sabem que outfile não é um ponteiro neste código de exemplo, e se perguntam como você pode testá-lo contra 0 como você normalmente só pode fazer com um ponteiro. (Lembre-se, dizendo !x, Onde x é algum ponteiro, você está testando x contra 0.) E isso simplesmente não faz sentido! E assim, para evitar confusão, é só chamar falhou(). Faz mais sentido.

Aqui estão algumas razões sua criação arquivo pode sufocar:

  • O diretório não existe.

  • Você está fora do espaço em disco e fora de sorte.

  • Sua aplicação não tem as permissões corretas para criar um arquivo.

  • O nome do arquivo era inválido - ou seja, ele continha caracteres do sistema operacional não permite que um nome de arquivo, como * ou?.

Como qualquer bom aplicativo, o aplicativo deve fazer duas coisas:

  1. 1.Verifique se a criação de arquivo bem-sucedida.

  2. 2.Se a criação do arquivo falhou, manipulá-lo adequadamente.

    Não basta imprimir uma mensagem horrível como Ops! Abortar!, deixando seus usuários pobres sem escolha, mas para lançar o monitor no chão. Em vez disso, fazer algo mais amigável - como a apresentação de uma mensagem dizendo-lhes que há um problema e sugerindo que eles podem liberar mais espaço em disco.

menu