編寫程式同時讀取兩個文本文件,在控制台並排顯示:
#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;
}
read_line// 文件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));
使用模運算 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 風格工具:
作者已規劃下一篇實現簡易文本比較程式,敬請期待。