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

C語言實現 cat 指令核心邏輯:檔案複製到標準輸出

     編輯:關於C語言

簡介

cat 是 Unix/Linux 系統中最基礎的檔案查看工具,核心功能是將指定檔案內容輸出到標準輸出。本文剖析一個精簡的 C 語言實現,展示檔案 I/O、錯誤處理與標準串流操作的標準模式。

完整程式碼

#include <stdio.h>
#include <stdlib.h>

void _filecopy(FILE *fp_in, FILE *fp_out);

int main(int argc, char *argv[]) {
    FILE *fp;
    char *prog = argv[0];           // 程式名稱,用於錯誤訊息

    if (argc == 1) {                // 無參數:複製 stdin 到 stdout
        _filecopy(stdin, stdout);
    } else {
        while (--argc > 0) {
            if ((fp = fopen(*++argv, "r")) == NULL) {
                fprintf(stderr, "%s:無法開啟 %s\n", prog, *argv);
                exit(1);
            } else {
                _filecopy(fp, stdout);
                fclose(fp);
            }
        }
    }

    if (ferror(stdout)) {           // 檢查輸出錯誤
        fprintf(stderr, "%s:輸出流錯誤!\n", prog);
        exit(2);
    }
    exit(0);
}

void _filecopy(FILE *fp_in, FILE *fp_out) {
    int c;
    while ((c = getc(fp_in)) != EOF) {
        putc(c, fp_out);
    }
}

關鍵設計點

1. 統一的複製函數 _filecopy

將「從輸入串流逐字元讀取並寫入輸出串流」封裝為獨立函數,主程式只需處理檔案開啟/關閉與參數迴圈,邏輯清晰且可複用。

2. 無參數時處理標準輸入

argc == 1 直接呼叫 _filecopy(stdin, stdout),符合 Unix 「一切皆檔案」哲學,標準輸入輸出亦是 FILE*。

3. 完善的錯誤處理

  • 開啟檔案失敗:輸出程式名與檔名,呼叫 exit(1)。
  • 輸出流錯誤(如磁碟滿、管道破裂):ferror(stdout) 檢測,exit(2)。
  • 使用 stderr 輸出錯誤,不干擾正常資料流。

4. 參數處理技巧

while (--argc > 0) 配合 *++argv 依序取得每個檔名,避免額外索引變數。

編譯與測試

$ gcc -o mycat mycat.c
$ echo "Hello World" > test.txt
$ ./mycat test.txt
Hello World
$ ./mycat < test.txt          # 標準輸入模式
Hello World
$ ./mycat test.txt nonexist   # 錯誤處理
mycat:無法開啟 nonexist

擴展方向

  • 新增 -n 顯示行號、-b 非空行編號。
  • 支援二進位模式 \"rb\"/\"wb\" 處理圖片等非文字檔。
  • 使用 fread/fwrite 以塊為單位複製,提升大檔案效能。

這個迷你 cat 雖小,却包含了 C 語言檔案操作的精髓:串流抽象、錯誤碼規範、資源釋放,是系統程式設計的入門典範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved