C 风格文件输入/输出---无格式输入/输出---(std::getchar,std::putchar,std::ungetc)

C++ 标准库的 C I/O 子集实现 C 风格流输入/输出操作。  头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 头文件提供有宽字符输入/输出能力的函数。

无格式输入/输出

从 stdin 读取字符

std::getchar

int getchar();

从 stdin 读取下个字符。

等价于 std::getc(stdin) 。

参数

(无)

返回值

成功时为获得的字符,失败时为 EOF 。

若文件尾条件导致失败,则另外设置 stdin 上的文件尾指示器(见 feof() )。若某个其他错误导致失败,则设置 stdin 上的错误指示器(见 ferror() )。


写字符到 stdout

std::putchar

int putchar( int ch );

写入字符 chstdout 。在内部,恰于写入前转换字符为 unsigned char 。

等价于 putc(ch, stdout) 。

参数

ch - 要写入的字符

返回值

成功时,返回被写入字符。

失败时,返回 EOF 并设置 stdout 上的错误指示器(见 ferror() )。

调用示例

#include 

int main(void)
{
    while (true)
    {
        char c = std::getchar();
        std::putchar(c);
    }
    return 0;
}

输出

C 风格文件输入/输出---无格式输入/输出---(std::getchar,std::putchar,std::ungetc)_第1张图片

写字符串到 stdout

int puts( const char *str );

写入每个来自空终止字符串 str 的字符及附加换行符 '\n' 到输出流 stdout ,如同以重复执行 std::putc 写入。

不写入来自 str 的空终止字符。

参数

str - 要写入的字符串

返回值

成功时返回非负值

失败时,返回 EOF 并设置 stdout错误指示器(见 std::ferror() )。

注意

std::puts 函数后附一个换行字符到输出,而 std::fputs 不这么做。

不同的实现返回不同的非负数:一些返回最后写入的字符,一些返回写入的字符数(或若字符串长于 INT_MAX 则返回它),一些简单地返回非负常量。

在重定向 stdout 到文件时,导致 std::puts 失败的典型原因是用尽了文件系统的空间。

调用示例

#include 

int main()
{
    int rc = std::puts("Hello World");

    if (rc == EOF)
    {
        std::perror("puts()");    // POSIX 要求设置 errno
    }
    return 0;
}

输出

C 风格文件输入/输出---无格式输入/输出---(std::getchar,std::putchar,std::ungetc)_第2张图片

把字符放回文件流

std::ungetc

int ungetc( int ch, std::FILE *stream );

ch 不等于 EOF ,则推入字符 ch (转译为 unsigned char )到与流 stream 关联的输入缓冲区,方式满足从 stream 的后继读取操作将取得该字符。不修改与流关联的外部设备。

流重寻位操作 std::fseek 、 std::fsetpos 和 std::rewind 弃去 ungetc 的效果。

若调用 ungetc 多于一次,而无中间读取或重寻位,则可能失败(换言之,保证大小为 1 的回放缓冲区,但任何更大的缓冲区是实现定义的)。若成功进行多次 ungetc ,则读取操作以 ungetc 的逆序取得回放的字符。

ch 等于 EOF ,则操作失败而不影响流。

ungetc 的成功调用清除文件尾状态标志 std::feof 。

在二进制流上对 ungetc 的成功调用将流位置指示器减少一(若流位置指示器为零,则行为不确定)。

在文本流上对 ungetc 的成功调用以未指定方式修改流位置指示器,但保证在以读取操作取得所有回放字符后,流位置指示器等于其在 ungetc 之前的值。

参数

ch - 要推入输入流缓冲区的字符
stream - 要回放字符到的文件流

返回值

成功时返回 ch

失败时返回 EOF ,而给定的流保持不变。

注意

实践中,回放缓冲区的大小会在 4k ( Linux 、 MacOS )和 4 ( Solaris )或保证的最小值 1 ( HPUX 、 AIX )间变化。

若回放的字符等于存在于外部字符序列中该位置的字符,则回放缓冲区的表观大小可以更大(实现可以简单地自减读取的文件位置指示器,并避免维护回放缓冲区)。

调用示例

#include 
#include 

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;
}

输出

C 风格文件输入/输出---无格式输入/输出---(std::getchar,std::putchar,std::ungetc)_第3张图片

你可能感兴趣的:(C,风格文件输入/输出,c语言,标准库模板,C,风格文件输入/输出,ungetc,getchar)