C语言中的stdin,stdout,stderr以及errno

在 C 语言中,stdinstdoutstderr 是标准输入、标准输出和标准错误流,它们由标准库定义,用于处理程序与外部环境之间的数据交互。以下是对它们的详细解析:

1. stdin (标准输入流)

  • 概念

    • stdin 是一个文件指针,代表程序的标准输入。
    • 默认从键盘接收输入数据,但可以通过重定向改变输入源,例如从文件或管道读取数据。
  • 相关函数

    • 常用于读取数据的函数包括:
      • scanf / fscanf(stdin, ...)
      • fgets
      • getc(stdin)
      • getchar (等价于 getc(stdin))
  • 示例代码

    #include <stdio.h>
    
    int main() {
        char buffer[100];
        printf("Enter a string: ");
        fgets(buffer, 100, stdin);  // 从标准输入读取数据
        printf("You entered: %s", buffer);
        return 0;
    }

    重定向示例

    ./program < input.txt

    以上命令将标准输入 stdin 指向 input.txt 文件,程序从文件中读取内容。

  • 2. stdout (标准输出流)

  • 概念

    • stdout 是一个文件指针,代表程序的标准输出。
    • 默认将数据输出到屏幕,但可以通过重定向将输出内容写入文件或发送到管道。
  • 相关函数

    • 常用于写入数据的函数包括:
      • printf / fprintf(stdout, ...)
      • putc(ch, stdout)
      • putchar(ch) (等价于 putc(ch, stdout))
  • 示例代码

    #include <stdio.h>
    
    int main() {
        printf("Hello, world!\n");  // 输出到标准输出(默认屏幕)
        fprintf(stdout, "This is another message.\n");
        return 0;
    }

    重定向示例

    ./program > output.txt
    

    以上命令将标准输出 stdout 指向 output.txt,程序的输出内容将写入该文件。

  • 3. stderr (标准错误流)

  • 概念

    • stderr 是一个文件指针,代表程序的标准错误输出。
    • 默认将错误信息输出到屏幕,但可以通过重定向改变输出目标。
    • stdout 不同,stderr 通常不被缓冲,确保错误信息能立即显示。
  • 相关函数

    • 常用于写入错误信息的函数包括:
      • fprintf(stderr, ...)
      • fputs("Error message", stderr)
      • perror (打印错误信息并附带 errno 描述)
  • 示例代码

    #include <stdio.h>
    
    int main() {
        int error_code = 1;
        if (error_code) {
            fprintf(stderr, "An error occurred. Error code: %d\n", error_code);
        }
        return 0;
    }
    

    重定向示例

    ./program 2> error.txt
    

    以上命令将标准错误输出 stderr 指向 error.txt,程序的错误信息将写入该文件。

  • 4. errno

  • 在 C 标准库和 POSIX 系统中,errno 是一个全局变量,用于表示最近一次系统调用或标准库函数发生的错误代码。
  • 头文件: 包含 <errno.h> 头文件。
  • 作用:
    • 当系统调用或标准库函数返回错误时,通常会设置 errno
    • errno 的值是一个错误代码,对应系统中定义的错误类型。
    • 示例:
      #include <stdio.h>
      #include <errno.h>
      #include <string.h>
      
      int main() {
          FILE *file = fopen("nonexistent.txt", "r");
          if (file == NULL) {
              perror("Error opening file");//等效
              printf("Error: %s\n", strerror(errno));
          }
          
          return 0;
      }
  • 缓冲机制

  • stdinstdout

    • 默认使用全缓冲模式(当输出到文件或终端时,数据积累到缓冲区后才写入)。
    • 如果 stdout 指向终端,通常会变为行缓冲模式。
  • stderr

    • 默认不使用缓冲区,直接输出数据,确保错误信息及时显示。
    • 重定向总结

      通过命令行重定向,可以控制这三个流的输入和输出目标:

    • 重定向标准输入:

      ./program < input.txt

      stdin 从文件读取数据。

    • 重定向标准输出:

      ./program > output.txt

      stdout 写入到文件。

    • 重定向标准错误:

      ./program 2> error.txt

      stderr 写入到文件。

    • 同时重定向标准输出和标准错误:

      ./program > output.txt 2> error.txt
    • 程序运行时的 标准输出标准错误输出 全部被写入 output_and_error.txt 文件,屏幕不会显示任何输出或错误信息:
    • ./program > output_and_error.txt 2>&1

    • 总结

    • stdin:程序从中读取输入,默认是键盘。
    • stdout:程序将输出写入,默认是屏幕。
    • stderr:程序将错误信息写入,默认是屏幕,不带缓冲。
    • 通过这些流,程序可以方便地与外部环境进行交互,同时通过重定向灵活控制输入输出的目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值