Sinalizando as bandeiras ios em C ++
Quando você abre um arquivo através da construção de qualquer um ofstream ou ifstream exemplo, você pode modificar a maneira como o arquivo será aberto pelo fornecimento de quais são chamados bandeiras. Em termos de computador, uma bandeira é simplesmente um pequeno item cuja presença ou falta de presença diz uma função como fazer algo. Com o ofstream e ifstream aulas, a função em questão é o construtor.
Uma bandeira parece ios :: app se você estiver usando um compilador que não é totalmente compatível com ANSI, ou parece ios_base :: app se você estiver usando um que é totalmente compatível com ANSI. Esta bandeira específica significa que você deseja gravar em um arquivo, mas você deseja anexar todos os dados existentes que podem já estar em um arquivo. Você fornece esta bandeira como um argumento do construtor para ofstream, como em qualquer um dos exemplos que se seguem:
ofstream outfile ( "AppendableFile.txt", ios :: app) -ofstream outfile ( "AppendableFile.txt", ios_base :: app) -
Você pode ver que a bandeira é adicionado como um segundo parâmetro para o construtor. Outras bandeiras existe além app, e você pode combiná-las usando a ou operador |. Por exemplo, uma bandeira está ios :: NoCreate (Que não está incluído no compiladores mais recentes).
Isto significa uma # 147 só de abrir o arquivo se ele já existe. # 148- Ou seja, não criar o arquivo se ele não existe. (Lembrar, ofstream cria um arquivo se ele ainda não existir.) Se o arquivo não existir, o aberto irá falhar, e quando você chamar falhou, você vai receber de volta uma verdade.
o ios :: NoCreate bandeira é acessível com ios :: app. Juntos, estes significam abrir um arquivo existente e anexar a ele. Ou seja, os dois juntos só funcionará se o arquivo já existe, e a chamada vai abrir o arquivo para uma operação de acréscimo. Se o arquivo não existir, o arquivo não será criado. Aqui está uma chamada de exemplo:
ofstream outfile ( "../ MyFile.txt", ios :: app | ios :: NOCREATE) -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 () -
E se MyFile.txt não existe quando você executar este código, você recebe a mensagem Não foi possível abrir o arquivo! Mas se MyFile.txt existir, o aplicativo abre, acrescenta a cadeia Hi-lo e, finalmente, fecha-lo.
Acontece que o NoCreate flag não está disponível na nova biblioteca padrão. Vadio. Portanto, o código funciona somente se você estiver usando uma versão anterior da biblioteca. Ao usar o compilador Code :: Blocks, você verá a seguinte mensagem de erro:
erro: 'NoCreate' não é um membro de '-std :: ios'
No entanto, você vai querer testar se o seu compilador particular inclui uma biblioteca que suporta ios :: NoCreate. Seu compilador pode apoiá-lo de qualquer maneira, mesmo que inclua a nova biblioteca padrão. Como uma alternativa para ios :: NoCreate, você pode usar o código a seguir (encontrados no FileOutput02 exemplo):
infile ifstream ( "MyFile.txt ../") - se (infile.fail ()) {cout lt; lt; "Não foi possível abrir o arquivo!" lt; lt; endl-retorno 0-} infile.close () - outfile ofstream ( "../ MyFile.txt", ios :: app) -outfile lt; lt; "Oi" lt; lt; endl-outfile.close () -
Neste caso, você começar por tentar abrir o arquivo para leitura. Se o arquivo não existe, não é possível ler a partir dele eo código sai com uma mensagem de falha. Se o código pode ler a partir do arquivo, ele reabre o arquivo para a escrita. Esta é uma solução complicada, mas funciona.
A seguir está uma lista dos sinalizadores disponíveis. Primeiro, aqui são os únicos para ios, no caso de você estiver usando um compilador que não é completamente compatível com ANSI:
ios :: app: Esta bandeira significa que você deseja abrir um arquivo e anexar a ele.
ios :: no: Integrar este flag se você quiser ler um arquivo.
ios :: out: Incluir esta bandeira se você quiser gravar em um arquivo.
ios :: trunc: Incluir esta bandeira se você quiser acabar com o conteúdo do arquivo antes de gravá-lo. É o oposto do acrescentar, e também é o padrão, se você não incluir especificamente a ios :: app.
ios :: NoCreate: Utilize este flag se você quiser garantir que o arquivo não será criado se ele não existir, resultando em que o arquivo não está sendo aberto.
ios :: noreplace: Esta bandeira é o oposto do NoCreate. Utilize este flag se você só quer criar um novo arquivo. Se você usar esta bandeira e o arquivo já existe, o arquivo não será aberto, e que a falha vai voltar verdade.
compiladores ANSI-compliant não suportam a ios :: noreplace bandeira também. Neste caso, você pode usar o oposto da correção para o ios: NoCreate bandeira, como mostrado aqui (e encontrada na FileOutput03 exemplo):
infile ifstream ( "MyFile.txt ../") - se {cout (infile.fail ()!) lt; lt; "O arquivo já existe!" lt; lt; endl-retorno 0-} infile.close () - outfile ofstream ( "../ MyFile.txt") - outfile lt; lt; "Oi" lt; lt; endl-outfile.close () -
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 escreve para ele.
Os sinalizadores a seguir estão disponíveis em um compilador que é absolutamente compatível com ANSI!
ios :: comeu: Utilize este sinalizador para ir para o final do arquivo depois de abri-lo. Normalmente, você usa esse sinalizador quando você quer acrescentar dados ao arquivo.
ios_base :: binário: Utilize este sinalizador para especificar que o arquivo que você está abrindo irá armazenar dados binário - ou seja, dados que não representa cadeias de caracteres.
ios_base :: no: Especifique este sinalizador quando você quer ler de um arquivo.
ios_base :: out: Incluir esta bandeira quando quiser gravar em um arquivo.
ios_base :: trunc: Integrar este flag se você quiser acabar com o conteúdo de um arquivo antes de gravá-lo.
ios_base :: app: Integrar este flag se você deseja anexar o arquivo. É o oposto do trunc - isto é, a informação que já está no arquivo quando você abre ele vai ficar lá.
Por que você precisa de um na bandeira e um Fora bandeira? Parece que o computador deve saber se você está escrevendo para um arquivo ou ler a partir dele, dependendo (respectivamente) se você usa ofstream ou ifstream. A resposta de porque você tem um dentro bandeira e um Fora flag é que outras classes estão disponíveis além ofstream e ifstream.
Os compiladores que ainda não suportam totalmente o padrão ANSI tem uma classe genérica em suas bibliotecas chamada fstream. Os compiladores ANSI-compliant têm em suas bibliotecas uma classe de modelo chamado basic_filebuf e uma classe chamada filebuf. Se você usar essas classes, você pode usar o dentro e Fora bandeiras.