首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言標準錯誤 stderr 與重定向機制

     編輯:關於C語言

C語言標準錯誤 stderr 與重定向機制

標準輸出 (stdout) 與標準錯誤 (stderr) 是兩條獨立的數據流。區分它們能讓「正常數據」與「錯誤訊息」分離,支援管道、重定向等 Unix 哲學工具鏈。

為什麼需要 stderr?

示例:讀取 GPS 數據文件轉 JSON,若遇非法經緯度需報錯但不污染 JSON 輸出。

#include <stdio.h>

int main() {
    float lat, lon;
    char info[80];
    int started = 0;
    puts("data[");
    while (scanf("%f,%f,%79[^\n]", &lat, &lon, info) == 3) {
        if (started) printf(",\n"); else started = 1;
        if (lat < -90.0 || lat > 90.0) {
            fprintf(stderr, "Invalid latitude: %f\n", lat);  // 寫入 stderr
            return 2;
        }
        if (lon < -180.0 || lon > 180.0) {
            fprintf(stderr, "Invalid longitude: %f\n", lon);
            return 2;
        }
        printf("{latitude:%f,longitude:%f,info:'%s'}", lat, lon, info);
    }
    puts("\n]");
    return 0;
}

重定向演示

# 僅重定向 stdout 到文件,stderr 仍顯示在終端
$ ./gps_json < gpsdata.csv > output.json
Invalid latitude: 95.000000     # 這行出現在螢幕,不在 output.json

# 同時重定向 stderr
$ ./gps_json < gpsdata.csv > output.json 2> errors.log

# 合併 stdout 和 stderr
$ ./gps_json < gpsdata.csv > all.log 2>&1
# 或
$ ./gps_json < gpsdata.csv &> all.log

核心知識點

流文件描述符預設設備典型用途C 函數
stdin0鍵盤輸入數據scanf, fgets, fread
stdout1終端正常輸出printf, puts, fwrite
stderr2終端錯誤/診斷信息fprintf(stderr,...), perror
  • fprintf(stderr, ...) 可將格式化錯誤信息發送到標準錯誤。
  • perror("msg") 自動附加當前 errno 對應的系統錯誤字串。
  • Shell 重定向操作符:> (stdout)、2> (stderr)、&> (合併)、2>&1 (stderr 重定向到 stdout)。
  • 最佳實踐:所有診斷、警告、錯誤輸出全部走 stderr;stdout 僅輸出結構化數據(JSON、CSV、純文本結果),便於管道處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved