Vídeo: Descodificación del sobrepeso por Marta Menéndez 2024
Quando você abre um arquivo construindo uma instância ofstream ou ifstream, você pode modificar a forma como o arquivo será aberto fornecendo o que são chamados de sinalizadores. Em termos de computador, um sinalizador é simplesmente um pequeno item cuja presença ou falta de presença informa uma função de como fazer algo. Com as classes ofstream e ifstream, a função em questão é o construtor.
Uma bandeira parece ios:: app se você estiver usando um compilador que não seja totalmente compatível com ANSI, ou se parece com ios_base:: app, se você estiver usando um que seja totalmente compatível com ANSI. Esta bandeira em particular significa que você deseja escrever em um arquivo, mas deseja anexar a dados existentes que já estejam em um arquivo. Você fornece essa bandeira como um argumento do construtor para o ofstream, como em qualquer um dos seguintes exemplos:
ofstream outfile ("AppendableFile. Txt", ios:: app); outstream do arquivo ("AppendableFile. txt", ios_base:: app);
Você pode ver que o sinalizador é adicionado como um segundo parâmetro para o construtor. Existem outras bandeiras além do aplicativo, e você pode combiná-las usando o operador ou, | Por exemplo, uma bandeira é ios:: nocreate (que não está incluído nos compiladores mais recentes).
Este significa "apenas abrir o arquivo se ele já existe. "Ou seja, não crie o arquivo se ele não existir. (Lembre-se, o ofstream cria um arquivo se ele ainda não existir). Se o arquivo não existir, o aberto falhará e, quando você falhar, você retornará um verdadeiro .
A bandeira ios:: nocreate é útil com ios:: app. Juntos, isso significa abrir um arquivo existente e anexá-lo . Ou seja, os dois juntos funcionarão somente se o arquivo já existir, e a chamada abrirá o arquivo para uma operação anexa. Se o arquivo ainda não existir, o arquivo não será criado. Aqui está uma amostra de chamada:
outstream outstream ("… / MyFile. Txt", ios:: app | ios:: nocreate); se (outfile. fail ()) {cout << "não pôde abrir o arquivo!" << endl; retornar 0;} outfile << "oi" << endl; outfile. fechar();
Se MyFile. txt não existe quando você executa esse código, você recebe a mensagem. Não foi possível abrir o arquivo! Mas se MyFile. txt existe, o aplicativo o abre, acrescenta a linha Hi e, finalmente, fecha-a.
Acontece que a bandeira nocreate não está disponível na nova Biblioteca Padrão. Vadio. Portanto, o código funciona apenas se você estiver usando uma versão anterior da biblioteca. Ao usar o código:: compilador de blocos, você vê a seguinte mensagem de erro:
erro: 'nocreate' não é membro de '; std:: ios '
No entanto, você quer testar se seu compilador específico inclui uma biblioteca que suporte ios:: nocreate.Seu compilador pode suportá-lo de qualquer maneira, mesmo que inclua a nova Biblioteca Padrão. Como uma alternativa para ios:: nocreate, você pode usar o seguinte código (encontrado no exemplo FileOutput02):
ifstream infile ("… / MyFile. Txt"); se (infile. fail ()) {cout << "não pôde abrir o arquivo!" << endl; retornar 0;} infile. fechar(); ofstream outfile ("… / MyFile. txt", ios:: app); outfile << "oi" << endl; outfile. fechar();
Neste caso, você começa por tentar abrir o arquivo para leitura. Se o arquivo não existir, você não pode ler e o código sai com uma mensagem de falha. Se o código pode ler do arquivo, ele reabre o arquivo para escrever. Esta é uma solução complicada, mas funciona.
A seguir, uma lista dos sinalizadores disponíveis. Primeiro, aqui estão os ios, no caso de você estar usando um compilador que não é completamente compatível com ANSI:
-
ios:: app: Esse sinalizador significa que deseja abrir um arquivo e anexá-lo.
-
ios:: in: Inclua esta bandeira se quiser ler de um arquivo.
-
ios:: out : Incluir este sinalizador se você quiser escrever em um arquivo.
-
ios:: trunc : Inclua este sinalizador se desejar limpar o conteúdo do arquivo antes de escrever para ele. É o oposto de anexar, e também é o padrão se você não incluir especificamente o ios:: app.
-
ios:: nocreate : Use este sinalizador se quiser garantir que o arquivo não seja criado se ele não existir, resultando na não abertura do arquivo.
-
ios:: noreplace : Esta bandeira é o oposto do nocreado. Use esta bandeira se você quiser apenas criar um novo arquivo. Se você usa esse sinalizador e o arquivo já existe, o arquivo não será aberto e essa falha retornará true .
Os compiladores compatíveis com ANSI não suportam o ios:: noreplace flag também. Neste caso, você pode usar o oposto da correção para a bandeira ios: nocreate, como mostrado aqui (e encontrado no exemplo FileOutput03):
ifstream infile ("… / MyFile. Txt"); se (! infile. fail ()) {cout << "o arquivo já existe!" << endl; retornar 0;} infile. fechar(); outstream ("… / MyFile. txt"); outfile << "oi" << endl; outfile. fechar();
Neste caso, o código tenta abrir o arquivo para leitura. Se o arquivo existir, o código mostra uma mensagem de erro e sai. Caso contrário, o código cria um novo arquivo e grava-lo.
Os seguintes sinalizadores estão disponíveis em um compilador que é absolutamente compatível com ANSI!
-
ios:: comeu: use esta bandeira para ir ao final do arquivo depois de abri-lo. Normalmente, você usa esse sinalizador quando deseja anexar dados ao arquivo.
-
ios_base:: binário: use esta bandeira para especificar que o arquivo que você está abrindo conterá dados binários - ou seja, dados que não representam cadeias de caracteres.
-
ios_base:: in: Especifique este sinalizador quando quiser ler de um arquivo.
-
ios_base:: out: Inclua esta bandeira quando quiser escrever para um arquivo.
-
ios_base:: trunc: Inclua este sinalizador se desejar limpar o conteúdo de um arquivo antes de escrever para ele.
-
ios_base:: app: Inclua este sinalizador se desejar anexar ao arquivo. É o oposto do trunc - ou seja, a informação que já está no arquivo quando você abri-lo permanecerá lá.
Por que você precisa de uma bandeira e uma bandeira fora? Parece que o computador deve saber se você está escrevendo para um arquivo ou lendo dele, dependendo (respectivamente) de se você usa ostream ou ifstream. A resposta para o porquê você tem uma bandeira e uma bandeira fora é que outras classes estão disponíveis além de corrente e ifstream.
Os compiladores que ainda não suportam totalmente o padrão ANSI têm uma classe genérica em suas bibliotecas chamadas fstream. Os compiladores compatíveis com ANSI têm em suas bibliotecas uma classe de modelo chamada basic_filebuf e uma classe chamada arquivobuf. Se você usar essas classes, você pode usar as bandeiras de entrada e saída.