É possível que a entrada e saída ocorra em uma sessão. Isso é possível pelo modelo de classe, Basic_fstream. Agora, o FStream é sinônimo de Basic_fstream. FStream, que ainda é básico_fstream, usa Basic_ifstream e Ofstream para operar.
Para fazer a entrada sozinha, faça a saída sozinha ou ambos em uma sessão, basta iniciar o programa C ++ com o seguinte inclui e invocações de namespace:
#incluirEste tutorial possui quatro seções principais: abrindo e fechamento de um fluxo de arquivo, fluxo de arquivo de saída, anexando, fluxo de arquivos de entrada e edição de um arquivo. Editar um arquivo significa inserção e saída de um fluxo.
Conteúdo do artigo
Abrindo e fechando um fluxo de arquivo
Antes que um fluxo possa ser aberto, um objeto de fluxo deve ser criado. Abrir um fluxo significa estabelecer um canal entre o programa C ++ e o arquivo no disco. Isso é realizado através do qual a sequência de caracteres se moverá para o arquivo; ou através do qual a sequência de caracteres deixará o arquivo e chegará ao programa; ou através do qual os personagens se moverão de um lado para o outro.
Um fluxo é aberto apenas para escrever (saída), leitura (entrada) ou leitura e escrita. Também pode ser aberto por outros motivos.
Antes de abrir um fluxo, o objeto de fluxo deve ser construído. A maneira mais simples de expressá -lo é a seguinte na função c ++ main ():
fStream STRM;
Agora, com o objeto STRM, as funções de membro do FStream, Open () e Close () podem ser usadas, precedindo cada um com o operador de pontos. A declaração a seguir pode ser usada para abrir um Fream para leitura:
void aberto ("PATH/TO/e/O FILE", iOS_BASE :: in);
A função de membro open () retorna vazio.
Com o objeto de fluxo, a declaração seria:
strm.abrir("./myfile ", ios_base :: in);
Como a função de membro do Open () retorna, para saber se o arquivo no disco foi aberto com sucesso, use a função do membro:
bool is_open () const;
Ele retorna zero para false se o arquivo não foi aberto e 1 para verdadeiro se o arquivo aberto. Agora nosso programa se parece com isso até agora:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.abrir("./myfile ", ios_base :: in);
if (strm.está aberto())
cout << "Open success" << endl;
outro
cout << "Open failed" << endl;
retornar 1;
retornar 0;
Para abrir um arquivo para escrever, use este sinalizador:
strm.aberto ("path/to/e/o/file", ios_base :: out);
ios_base :: in significa aberto para leitura e iOS_BASE :: Out significa aberto para escrever. Para abrir um arquivo para ler e escrever, use:
strm.aberto ("path/to/e/o/file", ios_base :: in | ios_base :: out);
Nota: A presença de “iOS_BASE :: in | ios_base :: Out ”, que usa lógico ou para combinar ambos os sinalizadores como um único argumento para a função.
Fechar um fluxo significa fechar o canal através do qual os dados podem ser enviados de um lado para o outro entre o programa e o arquivo. Não há mais dado pode ser enviado em qualquer direção usando esse canal. Fechar o fluxo não está fechando o objeto de fluxo. O mesmo fluxo ainda pode ser usado para abrir um novo canal, que deve ser fechado após o uso na transmissão de dados. Torne o hábito de fechar qualquer fluxo de arquivo, depois de ser aberto. Quando um fluxo é fechado, quaisquer dados na memória que deveriam estar no arquivo são enviados para o arquivo antes de realmente fechar. O protótipo da função do membro para fechar o Fream é:
vazio close ();
Retorna vazio, infelizmente. Então, para saber se o fechamento foi bem -sucedido, use a função do membro:
bool is_open () const;
Se o fechamento fosse bem -sucedido, isso retornaria zero, o que significa que o fluxo não está mais aberto. Se o fechamento não tivesse êxito, ele retornaria 1 e significa que o fluxo não poderia ser fechado.
Operação de fluxo de arquivo de saída
Agora, demonstraremos a abertura de um arquivo e dando a ele um novo conteúdo de dados. Para abrir um fluxo de saída com fsream, basta usar iOS_BASE :: Out Sozinho na função de membro Open (). O programa a seguir abre um arquivo e envia o conteúdo de uma string a ele:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc1.txt ", ios_base :: out);
se (!strm.está aberto())
cout << "File could not be opened!" << endl;
retornar 1;
char str [] = "A: Esta é a primeira linha.\ n "
"B: Esta é a segunda linha.\ n "
"C: Esta é a terceira linha.\ n ";
strm << str;
strm.fechar();
if (strm.está aberto())
cout << "Stream could not close!" << endl;
retornar 1;
cout << "Success, check file" << endl;
retornar 0;
O nome do arquivo é doc1.O txt pode incluir um caminho completo ou um caminho relativo. O novo conteúdo é identificado pelo STR no programa. No final do programa, o conteúdo da string teria sido inserido no fluxo e, portanto, o arquivo com a instrução:
strm << str;
Cout é um objeto de saída padrão e normalmente é usado para o console. Ele usa o operador de extração, << . O operador de extração também é usado com fluxos de arquivo. O objeto de fluxo de arquivos aqui é strm. O caractere '\ n' no final de cada cotação acima é garantir que a próxima linha apareça abaixo no arquivo de saída:
Em vez de enviar texto para o arquivo com o operador de inserção, a função Write () pode ser usada. O código a seguir ilustra o seguinte:
BASIC_OSTREAM & WRITE (const char_type* s, streamsize n)Aqui está o código completo com a função de gravação usada:
#incluir
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc2.txt ", ios_base :: out);
se (!strm.está aberto())
cout << "File could not be opened!" << endl;
retornar 1;
char str [] = "A: Esta é a primeira linha.\ n "
"B: Esta é a segunda linha.\ n "
"C: Esta é a terceira linha.\ n ";
strm.escreva (str, strlen (str));
strm.fechar();
if (strm.está aberto())
cout << "Stream could not close!" << endl;
retornar 1;
retornar 0;
O primeiro argumento da função write () é o identificador da matriz de caracteres. O segundo argumento é o número de caracteres (sem \ 0) na matriz.
Anexando caracteres a um arquivo
Para anexar texto a um arquivo, use "iOS_Base :: App" sozinho, em vez de "iOS_BASE: OUT" na função de membro open (). Ainda assim, use o operador de inserção, <<, as follows:
#incluir
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc2.txt ", ios_base :: app);
se (!strm.está aberto())
cout << "File could not be opened!" << endl;
retornar 1;
char str [] = "D: Esta é a quarta linha.\ n ";
strm << str;
strm.fechar();
if (strm.está aberto())
cout << "Stream could not close!" << endl;
retornar 1;
cout << "Success, check file" << endl;
retornar 0;
O arquivo de saída agora deve ter quatro linhas.
Operação de fluxo de arquivos de entrada
Agora vamos demonstrar a leitura de um personagem de arquivo por personagem com fStream. Para ler um arquivo com fStream, use ios_base :: in como a bandeira na função de membro open (). O programa a seguir lê todo o conteúdo do arquivo e o exibe no console:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc1.txt ", ios_base :: in);
se (!strm.está aberto())
cout << "Open file failed" << endl;
retornar 1;
char c;
enquanto (!strm.eof ())
strm.obtenha (c);
cout << c;
strm.fechar();
retornar 0;
O EOF () é uma função de membro e retorna 1 quando o final do arquivo é atingido e zero caso contrário. O programa lê os caracteres do arquivo, um a um, até o final do arquivo ser alcançado. Ele usa a função get () membro, colocando o personagem de leitura na variável C, que já foi declarada. Cout envia cada personagem para o console. A saída deve ser:
A: Esta é a primeira linha.Lendo o arquivo inteiro com uma função
O arquivo inteiro pode ser lido usando a função do membro:
Basic_istream & get (char_type* s, streamsize n, char_type delim);Ele copia os caracteres do arquivo e os coloca em uma matriz de personagens. Faz isso até encontrar o delimitador, EOF, ou até que ele copie o N - 1 caractere. Ele se encaixará no caractere nulo ('\ 0') como o último personagem consecutivo na matriz. Isso significa que o número de caracteres escolhidos para a matriz deve ser estimado como pelo menos o número de caracteres de arquivo (incluindo qualquer \ n), mais um para o caractere nulo. Não copia o personagem delimitador. O código a seguir copia todo o arquivo de doc1.txt, usando esta função de membro:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc1.txt ", ios_base :: in);
se (!strm.está aberto())
cout << "Open file failed" << endl;
retornar 1;
Char arr [150];
strm.obtenha (arr, 150, EOF);
strm.fechar();
cout << arr << endl;
retornar 0;
Leitura de linha por linha
A função de membro a ser usada para ler em um arquivo com FStream Line by Line é:
Basic_istream& getLine (char_type* s, streamsize n, char_type delim);
Ele copia os caracteres do arquivo e os coloca em uma matriz de personagens. Faz isso até encontrar o delimitador (e.g. '\ n') ou até que ele copie o caractere n - 1. Ele se encaixará no personagem NUL ('\ 0') como o último personagem consecutivo na matriz. Isso significa que o número de caracteres escolhidos para a matriz deve ser estimado como pelo menos o número de caracteres visíveis, mais um para o caractere nulo. Não copia o personagem delimitador. O código a seguir copia todo o arquivo de doc1.txt linha por linha, usando esta função de membro:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc1.txt ", ios_base :: in);
se (!strm.está aberto())
cout << "Open file failed" << endl;
retornar 1;
Char arr [100];
enquanto (!strm.eof ())
strm.getLine (arr, 100, '\ n');
cout << arr << endl;
strm.fechar();
retornar 0;
Como '\ n' não é copiado ao copiar uma linha, o endl deve ser usado para a tela de saída. Observe que o número de caracteres na matriz e a variável de streamsize foi feito o mesmo. Se for conhecido com antecedência que o delimitador é '\ n', a seguinte função do membro pode ser usada:
Basic_istream& getLine (char_type* s, streamsize n);
Buscando no arquivo
Personagens incluindo '\ n' têm suas posições naturais no arquivo, começando de 0, depois 1, 2, 3 e assim por diante. A função de membro de Seekg (POS) apontaria o ponteiro para o caráter de uma posição no objeto de fluxo. Então, obtenha (c) pode ser usado para obter esse personagem. O personagem no 27º Posição do Doc1 atual.O arquivo txt é 'b'. O código a seguir lê e exibe:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc1.txt ", ios_base :: in);
se (!strm.está aberto())
cout << "Open file failed" << endl;
retornar 1;
char c;
strm.Seekg (27);
strm.obtenha (c);
cout << c << endl;
strm.fechar();
retornar 0;
Se a posição dada for maior que a do último caractere no arquivo (menos 1), o nulo será retornado.
Função Tellg ()
Enquanto um arquivo está sendo lido, um ponteiro interno aponta para o próximo personagem a ser lido. A função do membro Tellg () pode obter o número de posição do personagem que o ponteiro está apontando para. Quando o arquivo é aberto, o Tellg () retornará 0 para o primeiro caractere. Depois de ler a primeira linha, Tellg () retornaria um número como 27 no exemplo abaixo:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc1.txt ", ios_base :: in);
se (!strm.está aberto())
cout << "Open file failed" << endl;
retornar 1;
Char arr [100];
int pos;
strm.getLine (arr, 100, '\ n');
POS = STRM.Tellg ();
strm.fechar();
cout << "Position in file is now: " << pos <retornar 0;
A saída é:
~ $ ./t9
A posição no arquivo é agora: 27
A função equivalente para a saída é o Tellp ().
Seekdir
Seekdir significa procurar orientação. Suas constantes definidas na biblioteca iOS_Base são: Breando para o início do arquivo, curs para a posição atual do arquivo e termine para o término do arquivo. A função acima seekg () está sobrecarregada para o fluxo de entrada como:
Basic_istream & Seekg (Off_type, iOS_Base :: Seekdir)
Então, se o ponteiro interno está apontando para o personagem na posição 27, contando o começo desde 0, então
strm.Seekg (0, ios_base :: cur);
Manterá o ponteiro na posição atual.
strm.Seekg (5, ios_base :: cur);
Vai levar o ponteiro 5 lugares à frente para apontar para "eu" no segundo "este" do doc1.arquivo txt.
strm.procureg (-5, ios_base :: cur);
Vai levar o ponteiro 5 lugares para trás para apontar para "eu" na primeira "linha" do doc1.arquivo txt. Observe que a posição do caractere nova '\ n', que não é exibida na saída, é contada.
Agora, não importa onde o ponteiro possa estar,
strm.Seekg (0, iOS_Base :: Beg);
Leva e mantém o ponteiro no início do arquivo; para apontar para o primeiro caractere do arquivo, com um deslocamento de 0. Nesse caso, ele apontará para "um".
strm.Seekg (5, iOS_Base :: BEG);
Levará o ponteiro para o início com um deslocamento de 5 lugares à frente; Ponto em "eu" no primeiro "este" do doc1.arquivo txt. Observe que o espaço único é contado como um personagem.
Um número inteiro negativo na posição de deslocamento para "ios_base :: beg" não é útil.
Bem, não importa onde o ponteiro possa estar,
strm.Seekg (0, iOS_base :: end);
Levará e manterá o ponteiro logo após o final do arquivo; para apontar para nada.
Um número inteiro positivo na posição de deslocamento para "ios_base :: end" não é útil.
strm.procureg (-5, ios_base :: end);
Levará o ponteiro até o fim com um deslocamento de 5 lugares atrás; Ponto para "eu" na última "linha" do doc1.arquivo txt. Observe que '\ n' e o ponto são contados como um personagem cada.
O código a seguir ilustra o uso da função, na posição atual, com um deslocamento negativo e positivo:
#incluir
#incluir
usando namespace std;
int main ()
fStream STRM;
strm.aberto ("doc1.txt ", ios_base :: in);
se (!strm.está aberto())
cout << "Open file failed" << endl;
retornar 1;
char c;
strm.Seekg (27);
strm.Seekg (0, ios_base :: cur);
strm.obtenha (c);
cout << c << endl;
strm.procureg (-5, ios_base :: cur);
strm.obtenha (c);
cout << c << endl;
strm.Seekg (+10, ios_base :: cur);
strm.obtenha (c);
strm.fechar();
retornar 0;
A saída é:
B
n
A função get () membro muda o ponteiro um lugar à frente após sua execução.
A função equivalente para a saída é:
BASIC_OSTREAM& Seekp (off_type, ios_base :: seekdir)
Observe o "P" em Seekp for put, em oposição a "G" em Seekg for Get.
Conclusão
A classe FStream lida com a entrada de um arquivo para um programa C ++ e saída do programa para o arquivo. Para usar o C ++ FStream, um objeto da classe deve ser instanciado. O objeto de fluxo então deve ser aberto para entrada ou saída ou ambos. Para anexar texto ao arquivo, o fluxo deve ser aberto para anexar. Faça o hábito de sempre fechar o fluxo depois de ser aberto e usado. Se o arquivo for um arquivo de imagem, então ios_base :: binário terá que ser orado usando | , com o segundo argumento da função de membro Open (). Esperamos que este artigo tenha ajudado você a usar o C ++ FStream.