[C++] Fluxo de entrada e saída (fluxo de E/S)


1. Entrada e saída da linguagem C

Os métodos de entrada e saída mais usados ​​na linguagem C são scanf() e printf(). scanf() é para ler dados do dispositivo de entrada padrão (teclado) e armazenar o valor em uma ou algumas variáveis; printf() é para enviar o texto/string especificado para o dispositivo de saída padrão (tela) .

A linguagem C usa buffers correspondentes para entrada e saída. Como mostrado abaixo:

insira a descrição da imagem aqui

Compreensão dos buffers de entrada e saída:

  1. A implementação de E/S de baixo nível pode ser blindada.A implementação de E/S de baixo nível geralmente depende da implementação do kernel do sistema operacional.Se essa parte da diferença puder ser blindada, os programas portáteis podem ser facilmente escritos.
  2. O comportamento de leitura de "linha" pode ser realizado. Para computadores, não existe o conceito de "linha", mas com esta parte, o conceito de "linha" pode ser definido, e então o conteúdo do buffer pode ser analisado para retornar uma "linha" ".

2. O que é fluxo

"Fluxo" significa fluxo, o processo pelo qual a matéria flui de um lugar para outro. Especificamente, é uma descrição abstrata de um dado ordenado, contínuo e direcional (a unidade pode ser bit, byte, pacote).

Fluxo C++ refere-se ao processo de entrada de informações de dispositivos de entrada externos (como teclado) para o interior do computador (como memória) e saída da memória para dispositivos de saída externos (monitores). Este processo de entrada e saída é vividamente comparado ao "fluxo".

Suas características são: ordenada, contínua e direcional

Para realizar este tipo de fluxo, C++ define a biblioteca de classes padrão de E/S. Cada uma dessas classes é chamada de fluxo ou classe de fluxo, que é usada para completar uma determinada função. Esses fluxos serão apresentados a seguir.


Três, fluxo de E/S C++

1. Visão Geral

O sistema C++ implementa uma enorme biblioteca de classes, como mostra a figura abaixo. Entre elas, ios é a classe base, e outras classes são derivadas direta ou indiretamente da classe ios.
insira a descrição da imagem aqui


2. Fluxo de E/S padrão

(1)cin、cout、cerr、clog

A biblioteca padrão C++ fornece quatro objetos de fluxo global cin, cout, cerr e clog. Use cout para saída padrão, ou seja, os dados fluem da memória para o console (display); use cin para entrada padrão, ou seja, os dados são inseridos no programa através do teclado; use cerr para saída de erro padrão; use clog para log saída.

Como pode ser visto na figura anterior, cout, cerr e clog são três objetos diferentes da classe ostream, portanto, esses três objetos são basicamente os mesmos, mas os cenários de aplicação são diferentes.

Conforme mostrado na figura abaixo, todos eles são exibidos no display. A intenção original é usar cout para saída geral, cerr para saída de erro e clog para saída de log, mas geralmente os dois últimos raramente são usados, e cout é usado para todas as saídas.

Os resultados são os seguintes:
insira a descrição da imagem aqui


(2) cin, cout e scanf, printf

C++ fornece cin, cout, a linguagem C fornece scanf, printf, eles podem tanto entrada quanto saída, mas é recomendado usar cin e cout primeiro, se você encontrar entrada e saída formatada, use scanf, printf (cin , cout também pode formatar entrada e saída, mas é mais complicado de usar, é melhor usar diretamente o scanf pronto, printf).

Ao mesmo tempo, como C++ é bastante diferente da linguagem C em alguns aspectos, às vezes haverá problemas em misturar quatro entradas e saídas.

Por exemplo, a string usa o valor de tamanho para marcar o final da string em C++, enquanto na linguagem C, '\0' é usado para marcar o final da string. Essa diferença pode causar problemas durante a entrada e saída. por esta razão, a string também c_str() é fornecida especialmente para operações na linguagem C.


(3) Sobrecarga de entrada e saída

Cin e cout podem inserir e emitir diretamente tipos internos (como int, double, etc.) e alguns tipos personalizados padrão (como string, etc.), porque a biblioteca padrão sobrecarregou todos esses tipos de entrada e saída, e pode ser usado diretamente.

insira a descrição da imagem aqui

Para nossos tipos personalizados, se quisermos usar cin e cout diretamente para entrada e saída, precisamos sobrecarregar >> e << por nós mesmos, caso contrário, não podemos usá-los diretamente.


(4)getline

Assim como o scanf, o cin também divide os dados com espaços e quebras de linha, portanto, para uma linha de dados com espaços, ele não pode ler tudo. Nesse caso, getline é usado e getline divide os dados com quebras de linha, conforme mostrado a seguir figura. .

Os resultados são os seguintes:
insira a descrição da imagem aqui


(5) Entrada de loop

Ao inserir várias linhas de conteúdo, as seguintes soluções podem ser usadas.

Os resultados são os seguintes:
insira a descrição da imagem aqui
semelhantes à linguagem C:

char buffer[100];
while(scanf("%s", buffer) != EOF)
{
    
    
	//...
}

Você pode usar Ctrl+C para finalizar a entrada. Sua essência é enviar um sinal para o processo. Para detalhes, você pode ver o sinal de processo de [Ten Thousand Characters Detailed Linux Series] , que é o mesmo no Linux e no Windows.


2. Fluxo de arquivo fstream

(1) ifstream、 ofstream

ifstream cria um objeto da seguinte forma, onde name é o nome do arquivo e mode é o modo de operação.

ifstream ifs(name, mode);

Existem os seguintes modos para escolher:

insira a descrição da imagem aqui

As funções-membro que podem ser chamadas pelo objeto ifstream são comumente usadas get, getline, read, seekg, tellg, etc. Você pode ter uma ideia geral do que ele faz olhando o nome da função. get obtém o arquivo um caractere de cada vez, getline obtém o arquivo uma linha de cada vez, read lê uma parte do conteúdo do arquivo, seekg define a posição do ponteiro do arquivo e tellg encontra a posição do ponteiro do arquivo.


(2) Uso

  1. Defina um objeto de fluxo de arquivo: ifstream (apenas para entrada), ofstream (apenas para saída), fstream (para entrada e saída)
  2. Use a função de membro do objeto de fluxo de arquivo para abrir um arquivo de disco para estabelecer um relacionamento entre o objeto de fluxo de arquivo e o arquivo de disco
  3. Operações de leitura e gravação em arquivos usando operadores de extração e inserção ou funções de membro para ler e gravar
  4. fechar arquivo

Semelhante ao uso da linguagem C

Os dois trechos de código a seguir demonstram, respectivamente, a leitura e gravação de arquivos ifstream e ofstream.O método de escrita é semelhante às interfaces de fread e fwrite na linguagem C, mas tornou-se orientado a objetos.

O código a seguir usa ifstream para ler o conteúdo do arquivo.

Os resultados são os seguintes:
insira a descrição da imagem aqui


O código a seguir é usar ofstream para gravar conteúdo no arquivo, o método de uso é basicamente o mesmo que ifstream.

Os resultados são os seguintes:
insira a descrição da imagem aqui


Uso de C++

O seguinte é um novo uso do fluxo de arquivo fornecido pelo C++. O fluxo de arquivo também é um fluxo, então ele também pode usar << ou >> para ler e escrever. O uso é o seguinte.

código mostrar como abaixo:

void WriteFile()
{
    
    
	//类似于C语言的用法
	//ofstream ofs("write.txt");
	//ofs.put('h');
	//char msg[] = "ello world";
	//int size = sizeof(msg);
	//ofs.write(msg, size);
	//可调可不调,因为ofs出了作用域后析构函数会自动调用
	//ofs.close();

	//C++的新用法
	ofstream ofs("write.txt");
	char c = 'h';
	string str = "ello world";

	ofs << c << str;
}

int main()
{
    
    
	WriteFile();
	return 0;
}

Dessa forma, o objeto ofstream também pode gravar conteúdo no arquivo por meio do fluxo como cout.

Os resultados são os seguintes:
insira a descrição da imagem aqui

O uso de ifstream é o mesmo, mas a direção do fluxo deve ser invertida, então não entrarei em detalhes aqui.


3. String stream sstream

sstream inclui istringstream, ostringstream e stringstream, que são usados ​​para entrada, saída e operações de entrada e saída de fluxo, mas geralmente é mais conveniente usar stringstream diretamente.

(1) ler

código mostrar como abaixo:

#include <sstream>
#include <iostream>

using namespace std;

struct ServerInfo//一个简单的结构体
{
    
    
	string ip;
	int port;
};

int main()
{
    
    
	stringstream ss;//定义一个对象
	ServerInfo info = {
    
     "192.0.0.1",8081 };//初始化

	ss << info.ip << " "  << info.port;//将info的两个成员流入ss
	string str = ss.str();//通过成员函数str()拿到ss内存储的字符串
	cout << str << endl;//打印

	return 0;
}

O resultado da execução é o seguinte, o processamento de strings é muito conveniente.

Os resultados são os seguintes:
insira a descrição da imagem aqui


(2) escrever

Grave o conteúdo lido na nova estrutura com base na leitura anterior.

código mostrar como abaixo:

#include <sstream>
#include <iostream>

using namespace std;

struct ServerInfo
{
    
    
	string ip;
	int port;
};

int main()
{
    
    
	stringstream ss;
	ServerInfo info = {
    
     "192.0.0.1",8081 };

	ss << info.ip << " " << info.port;
	
	//将s中的内容又写入newInfo中
	//注意:不同项的内容必须以空格或换行结尾,这是C/C++都要求的
	ServerInfo newInfo;
	ss >> newInfo.ip >> newInfo.port;

	return 0;
}

Os resultados são os seguintes:

insira a descrição da imagem aqui


Obrigado por ler, se houver algum erro, por favor, critique e corrija

Acho que você gosta

Origin blog.csdn.net/weixin_51983604/article/details/124293916
Recomendado
Clasificación