Le sous-ensemble CI/O de la bibliothèque standard C++ implémente des opérations d'entrée/sortie de flux de style C. Le fichier d'en-tête <cstdio> fournit une prise en charge générale des fichiers et fournit des fonctions avec des capacités d'entrée/sortie de caractères étroits et multioctets, tandis que le fichier d'en-tête <cwchar> fournit des fonctions avec des capacités d'entrée/sortie de caractères larges.
Entrée/sortie non formatée
Lire les caractères depuis stdin
std::getchar
intgetchar(); |
Lisez le caractère suivant depuis stdin.
Équivalent à std::getc(stdin).
paramètre
(aucun)
valeur de retour
Le personnage obtenu en cas de succès, et EOF en cas d'échec.
Si une condition de fin de fichier provoque un échec, l'indicateur de fin de fichier sur stdin est en outre défini (voir feof()). Si une autre erreur a provoqué l'échec, l'indicateur d'erreur sur stdin est activé (voir ferror()).
Écrire des caractères sur la sortie standard
std::putchar
int putchar(int ch); |
Écrivez des caractères ch
dans stdout
. En interne, les caractères sont convertis en caractères non signés juste avant l'écriture.
Équivalent à putc(ch, stdout).
paramètre
ch | - | caractères à écrire |
valeur de retour
En cas de succès, renvoie le caractère écrit.
En cas d'échec, renvoie EOF et définit l'indicateur d'erreur sur stdout (voir ferror()).
Exemple d'appel
#include <cstdio>
int main(void)
{
while (true)
{
char c = std::getchar();
std::putchar(c);
}
return 0;
}
sortir
Écrire la chaîne sur la sortie standard
int puts( const char *str );
Écrit chaque caractère de la chaîne terminée par un caractère nul str
plus le caractère de nouvelle ligne ajouté '\n' dans le flux de sortie stdout
, comme s'il était écrit lors d'exécutions répétées de std::putc.
str
Le caractère nul de fin de n'est pas écrit .
paramètre
str | - | chaîne à écrire |
valeur de retour
Renvoie une valeur non négative en cas de succès
En cas d'échec, renvoie EOF et définit stdout
l' indicateur d'erreur (voir std::ferror()).
Avis
std::puts
La fonction ajoute un caractère de nouvelle ligne à la sortie, alors que std::fputs ne le fait pas.
Différentes implémentations renvoient différents nombres non négatifs : certaines renvoient le dernier caractère écrit, d'autres renvoient le nombre de caractères écrits (ou le renvoient si la chaîne est plus longue que INT_MAX) et certaines renvoient simplement une constante non négative.
Une cause typique d'échec lors de la redirection de la sortie standard vers un fichier std::puts
est le manque d'espace sur le système de fichiers.
Exemple d'appel
#include <cstdio>
int main()
{
int rc = std::puts("Hello World");
if (rc == EOF)
{
std::perror("puts()"); // POSIX 要求设置 errno
}
return 0;
}
sortir
remettre les caractères dans le flux de fichiers
std::ungetc
int ungetc( int ch, std::FILE *stream ); |
S'il n'est pas égal à EOF, le caractère (traduit en caractère non signé) ch
est poussé dans le tampon d'entrée associé au flux de telle manière que les opérations de lecture ultérieures obtiendront le caractère. Les périphériques externes associés au flux ne sont pas modifiés.ch
stream
stream
Les effets des opérations de recherche de flux std::fseek, std::fsetpos et std::rewind sont ignorés ungetc
.
S'il est appelé ungetc
plus d'une fois sans lectures intermédiaires ni bits de récupération, il peut échouer (en d'autres termes, un tampon de lecture de taille 1 est garanti, mais tout tampon plus grand est défini par l'implémentation). Si elle réussit plusieurs fois ungetc
, l'opération de lecture ungetc
obtient les caractères lus dans l'ordre inverse de.
Si ch
est égal à EOF, l'opération échoue sans affecter le flux.
Un ungetc
appel réussi à efface l'indicateur d'état de fin de fichier std::feof.
Un appel réussi à sur un flux binaire ungetc
décrémente l'indicateur de position du flux de un (le comportement n'est pas défini si l'indicateur de position du flux est nul).
Un appel réussi à sur un flux de texte ungetc
modifie l'indicateur de position du flux d'une manière non spécifiée, mais garantit qu'une fois que tous les caractères de lecture ont été obtenus avec une opération de lecture, l'indicateur de position du flux est égal à sa ungetc
valeur avant .
paramètre
ch | - | Caractères à insérer dans le tampon du flux d'entrée |
flux | - | Le flux de fichiers dans lequel les caractères doivent être lus |
valeur de retour
Retour sur succès ch
.
Renvoie EOF en cas d'échec, laissant le flux donné inchangé.
Avis
En pratique, la taille du tampon de lecture varie entre 4k (Linux, MacOS) et 4 (Solaris) ou le minimum garanti de 1 (HPUX, AIX).
La taille apparente du tampon de relecture peut être plus grande si le caractère lu est égal au caractère présent à cette position dans la séquence de caractères externe (implémentant un indicateur de position de fichier qui peut simplement décrémenter la lecture et éviter de maintenir le tampon de relecture).
Exemple d'appel
#include <cctype>
#include <cstdio>
void demo_scanf(const char* fmt, std::FILE* s)
{
if (*fmt == '%')
{
switch (*++fmt)
{
case 'u':
{
int c;
while (std::isspace(c = std::getc(s))) {} // 跳过前导空白
unsigned int num = 0;
while (std::isdigit(c))
{
num = num * 10 + c - '0';
c = std::getc(s);
}
std::printf("%%u scanned %u\n", num);
std::ungetc(c, s); // 重处理非数位
}
case 'c':
{
int c = std::getc(s);
std::printf("%%c scanned '%c'\n", c);
}
}
}
}
int main()
{
std::FILE* file = std::fopen("input.txt", "w+");
std::fputs("123x", file);
std::rewind(file);
demo_scanf("%u%c", file);
std::fclose(file);
return 0;
}