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

C語言實現雙文件並排顯示:左欄30字符、右欄30字符、第75-76列顯示字符總數

     編輯:關於C語言

需求分析

編寫程式同時讀取兩個文本文件,在控制台並排顯示:

  • 第 1-30 列:文件 1 內容(不足補空格)
  • 第 41-70 列:文件 2 內容(不足補空格)
  • 第 75-76 列:該行兩文件字符總數
  • 其餘列:空白
  • 每輸出 20 行,插入 2 空行

核心資料結構與常數

#define COL_WIDTH 30          // 每欄寬度
#define GAP       10          // 兩欄間距
#define SUM_COL   75          // 總數顯示起始列
#define LINES_PER_BLOCK 20    // 分塊行數
#define BLANK_LINES 2         // 分塊空行數

完整實現代碼

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

#define MAX_LINE 31  // 30 字符 + '\0'

char line1[MAX_LINE], line2[MAX_LINE];

// 讀取一行(最多 30 字符,遇換行或 EOF 停止)
int read_line(FILE *fp, char *buf) {
    int i = 0, ch;
    while (i < 30 && (ch = fgetc(fp)) != EOF && ch != '\n') {
        buf[i++] = (char)ch;
    }
    buf[i] = '\0';
    return i;  // 返回實際讀取字符數
}

// 輸出指定數量空格
void print_spaces(int n) {
    for (int i = 0; i < n; i++) putchar(' ');
}

int main() {
    FILE *fp1, *fp2;
    char fname1[256], fname2[256];
    int line_count = 0;

    printf("請輸入文件 1 名稱: "); scanf("%255s", fname1);
    printf("請輸入文件 2 名稱: "); scanf("%255s", fname2);

    fp1 = fopen(fname1, "r");
    fp2 = fopen(fname2, "r");
    if (!fp1 || !fp2) {
        perror("文件打開失敗");
        return 1;
    }

    int len1, len2;
    while (1) {
        len1 = read_line(fp1, line1);
        len2 = read_line(fp2, line2);
        if (len1 == 0 && len2 == 0) break;  // 兩文件均讀完

        // --- 文件 1 欄 ---
        if (len1 > 0) printf("%s", line1);
        print_spaces(COL_WIDTH - len1 + GAP);  // 補齊至第 41 列

        // --- 文件 2 欄 ---
        if (len2 > 0) printf("%s", line2);
        print_spaces(COL_WIDTH - len2 + (SUM_COL - (COL_WIDTH*2 + GAP))); // 補齊至第 75 列

        // --- 字符總數(第 75-76 列)---
        printf("%2d", len1 + len2);

        putchar('\n');
        line_count++;

        // 每 20 行插入 2 空行
        if (line_count % LINES_PER_BLOCK == 0) {
            putchar('\n'); putchar('\n');
        }
    }

    fclose(fp1);
    fclose(fp2);
    return 0;
}

關鍵邏輯說明

1. 讀行函數 read_line

  • 限制最多讀 30 字符,遇 `\n` 或 `EOF` 停止
  • 返回實際字符數,供後續對齊計算使用

2. 動態對齊算法

// 文件1結束後,需補齊:30列內容 + 10間距 = 40列,下一列即第41列
spaces1 = COL_WIDTH - len1 + GAP;

// 文件2結束後,補齊至第75列:已佔 30+10+30=70列,再補 5 列
spaces2 = COL_WIDTH - len2 + (SUM_COL - (COL_WIDTH*2 + GAP));

3. 分塊空行邏輯

使用模運算 line_count % 20 == 0 觸發雙空行,簡潔無需額外變數。

運行示例

假設 file1.txt:

Hello World
This is file one

file2.txt:

Good Morning
This is file two
Extra line here

輸出(以 `|` 標示列邊界):

Hello World                    Good Morning                   23
This is file one               This is file two               34
                               Extra line here                15


擴展方向:文本差異比較工具

本程式框架易於擴展為 diff 風格工具:

  • 逐行比對內容,標記異同
  • 新增行號顯示
  • 支援 ANSI 色碼高亮差異

作者已規劃下一篇實現簡易文本比較程式,敬請期待。

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