Entrée/sortie de fichier de style C ---entrée/sortie non formatée ---(std::getchar, std::putchar, std::ungetc)

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 chdans 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 strplus 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.

strLe 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 stdoutl' indicateur d'erreur (voir std::ferror()).

Avis

std::putsLa 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::putsest 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é) chest 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.chstreamstream

Les effets des opérations de recherche de flux std::fseek, std::fsetpos et std::rewind sont ignorés ungetc.

S'il est appelé ungetcplus 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 ungetcobtient les caractères lus dans l'ordre inverse de.

Si chest égal à EOF, l'opération échoue sans affecter le flux.

Un ungetcappel réussi à efface l'indicateur d'état de fin de fichier std::feof.

Un appel réussi à sur un flux binaire ungetcdé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 ungetcmodifie 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 ungetcvaleur 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;
}

sortir

Je suppose que tu aimes

Origine blog.csdn.net/qq_40788199/article/details/132790982
conseillé
Classement