C 程序的 scanf/printf 並不直接操作鍵盤/螢幕,而是讀寫 標準輸入 (stdin) 與 標準輸出 (stdout)。作業系統啟動程序時自動打開這兩個流,Shell 提供重定向操作符將其綁定到文件/管道/設備。
程序 csv2json 從 stdin 讀取經緯度信息,向 stdout 輸出 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;
printf("{latitude:%f,longitude:%f,info:'%s'}", lat, lon, info);
}
puts("\n]");
return 0;
}
gpsdata.csv42.123123,-71.321321,speed=21
41.123123,-71.421321,speed=11
43.123123,-71.621321,speed=18
44.123123,-71.321321,speed=17
45.123123,-71.321321,speed=21
42.523123,-70.321321,speed=20
# 編譯
gcc csv2json.c -o csv2json
# stdin 從文件讀取,stdout 寫入文件
./csv2json < gpsdata.csv > output.json
# output.json 內容:
# data[
# {latitude:42.123123,longitude:-71.321321,info:'speed=21'},
# {latitude:41.123123,longitude:-71.421321,info:'speed=11'},
# ...
# ]
| 操作符 | 含義 | 影響流 | 文件描述符 |
|---|---|---|---|
< file | 輸入重定向 | stdin | 0 |
> file | 輸出重定向(覆蓋) | stdout | 1 |
>> file | 輸出重定向(追加) | stdout | 1 |
2> file | 錯誤重定向 | stderr | 2 |
> file 2>&1 | 合併 stdout 和 stderr 到 file | 1,2 | 1,2 |
&> file | 同上(Bash 簡寫) | 1,2 | 1,2 |
cat data.csv | ./csv2json | jq . 進一步處理。stdout,錯誤走 stderr,生產環境分別收集。