O subconjunto CI/O da biblioteca padrão C++ implementa operações de entrada/saída de fluxo no estilo C. O arquivo de cabeçalho <cstdio> fornece suporte geral a arquivos e fornece funções com recursos de entrada/saída de caracteres estreitos e multibyte, enquanto o arquivo de cabeçalho <cwchar> fornece funções com amplos recursos de entrada/saída de caracteres.
Manipulação de erros
limpar erros
std::clearerr
void clearerr( std::FILE* stream ); |
Redefine sinalizadores e indicadores de erro para um determinado fluxo de arquivos EOF
.
parâmetro
fluxo | - | Fluxo de arquivos para redefinir sinalizadores de erro |
valor de retorno
(nenhum)
Exemplo de chamada
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int ch = 0;
FILE* fp = fopen("test.txt", "w");
if (fp)
{
ch = std::getc(fp);
std::printf("%c", ch);
if (std::ferror(fp))
{
std::cout << "Error set" << std::endl;
std::clearerr(fp);
}
}
if (!std::ferror(fp))
{
std::cout << "Error reset" << std::endl;
}
std::fclose(fp);
return 0;
}
saída
Verifique o final do arquivo
std::feof
int feof(std::FILE* fluxo); |
Verifica se o fim de um determinado fluxo de arquivos foi atingido.
parâmetro
fluxo | - | fluxo de arquivos para verificar |
valor de retorno
Diferente de zero se o final do fluxo de arquivos tiver sido atingido; 0 caso contrário.
Perceber
Esta função relata apenas o status do fluxo relatado pela operação de E/S mais recente; ela não examina a fonte de dados associada. Por exemplo, se a E/S mais recente foi std::fgetc retornando o último byte do arquivo, std::feof
zero será retornado. O próximo std::fgetc falha e altera o fluxo do arquivo para end-of-file . Só depois disso std::feof
ele retorna diferente de zero.
No uso típico, o fluxo de entrada interrompe o processamento em qualquer erro; em seguida, use feof
std::ferror e std::ferror para distinguir diferentes condições de erro.
Exemplo de chamada
#include <cstdio>
#include <cstdlib>
int main()
{
FILE* fp = std::fopen("test.txt", "r");
if (!fp)
{
std::perror("File opening failed");
return EXIT_FAILURE;
}
int c; // 注意:是 int 而非 char ,要求处理 EOF
while ((c = std::fgetc(fp)) != EOF) // 标准 C I/O 文件读取循环
{
std::putchar(c);
}
if (std::ferror(fp))
{
std::puts("I/O error when reading");
}
else if (std::feof(fp))
{
std::puts("End of file reached successfully");
}
std::fclose(fp);
return 0;
}
saída
Verifique se há erros no arquivo
std::ferror
int ferror( std::FILE* stream ); |
Verifique se há erros no fluxo fornecido.
parâmetro
fluxo | - | fluxo de arquivos para verificar |
valor de retorno
Diferente de zero se o fluxo de arquivos encontrou um erro; 0 caso contrário.
Exemplo de chamada
#include <cstdio>
#include <cstdlib>
#include <clocale>
#include <cwchar>
#include <iostream>
int main(void)
{
const char *fname = std::tmpnam(nullptr);
std::cout << "fname: " << fname << std::endl;
std::FILE* f = std::fopen(fname, "wb");
std::fputs("\xff\xff\n", f); // 不是合法的 UTF-8 字符序列
std::fclose(f);
std::setlocale(LC_ALL, "en_US.utf8");
f = std::fopen(fname, "rb");
std::wint_t ch;
while ((ch = std::fgetc(f)) != WEOF) // 试图作为 UTF-8 读取
{
std::printf("%#x ", ch);
}
if (std::feof(f))
{
puts("EOF indicator set");
}
if (std::ferror(f))
{
puts("Error indicator set");
}
return 0;
}
saída
Exibir a string correspondente ao erro atual no stderr
std::perror
void erro( const char *s ); |
Imprima o código de erro atualmente armazenado na variável de sistema errno para stderr.
A descrição é construída conectando os seguintes componentes:
s
O conteúdo da string de bytes terminada em nulo apontada é seguido por ":" (a menos ques
seja um ponteiro nulo ous
o caractere apontado por seja um caractere nulo)- Uma
errno
string de mensagem de erro definida pela implementação que descreve o código de erro armazenado seguido por '\n'. A string da mensagem de erro é equivalente ao resultado de std::strerror(errno).
parâmetro
é | - | Ponteiro para uma string terminada em nulo que contém uma mensagem explicativa |
valor de retorno
(nenhum)
Exemplo de chamada
#include <cmath>
#include <cerrno>
#include <cstdio>
int main()
{
double not_a_number = std::log(-1.0);
if (errno == EDOM)
{
std::perror("log(-1) failed");
}
return 0;
}