同時實現兩個文件的內容,實現兩個文件內容
字面上很容易理解,兩個文件的內容在同一個水平畫面上。文件1占1-30列,然後中間20列用空格隔開,文件2占剩下的30列。
下面我說下我的思路:
比如說規定兩篇文章水平的長度為80,文件1先輸入1-30個字符(輸夠的話就用空格符來頂替),然後在用20個空格副隔開,接著再輸入文件2的內容30個字符(輸夠的話也用空格補充),這樣就完成了一行的輸入。這麼想就簡單了,兩個循環,先外循環輸入一行,再內循環輸入80個字符。行數是不確定的,因為不知道文件的內容(就算知道了計算也很麻煩),但是列數是確定的,就80,不多不少。那麼怎麼才算結束輸入行退出呢?那就是兩個文件的內容都輸入完畢的時候。因為有可能文件1輸入完畢,但是文件2還沒有輸完,也可能反過來。值得注意的是文件結束符EOF和換行符'\n',因為這也是決定了什麼時候用空格補充來補夠字符數。
下面給出我實現的代碼:

![]()
1 /* 同時打開兩個文件 */
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #define MAX 80
6
7 void Readline(FILE *fp1, FILE *fp2);
8
9 int main(void)
10 {
11 FILE *f1, *f2;
12 char filename[256];
13
14 printf("請輸入文件1的名字:");
15 scanf(" %s", filename);
16
17 if ((f1 = fopen(filename, "r")) == NULL)
18 {
19 perror("cannot read");
20 exit(1);
21 }
22
23 printf("請輸入文件2的名字:");
24 scanf(" %s", filename);
25
26 if ((f2 = fopen(filename, "r")) == NULL)
27 {
28 perror("cannot read");
29 exit(1);
30 }
31
32 Readline(f1, f2); /* 分欄函數 */
33
34 fclose(f1);
35 fclose(f2);
36 return 0;
37 }
38
39
40
41
42 void Readline(FILE *fp1, FILE *fp2)
43 {
44 int count; /* 用來表示列數 */
45 char ch1 ,ch2;
46
47 ch1 = fgetc(fp1);
48 ch2 = fgetc(fp2);
49 while (1)
50 {
51 for (count = 1; count <= MAX; count++) /* 每一列都顯示,沒有的就顯示空格 */
52 {
53 if (count >= 1 && count <= 30) /* 文件1所占的范圍 */
54 {
55 if ((ch1 == EOF) || (ch1 == '\n'))
56 {
57 fprintf(stdout, "%c", ' ');
58 }
59 else
60 {
61 fprintf(stdout, "%c", ch1);
62 ch1 = fgetc(fp1);
63 }
64 }
65 if (count > 30 && count <= 50) /* 中間就用空格隔開兩個文件的內容 */
66 {
67 fprintf(stdout, "%c", ' ');
68 }
69
70
71 if (count > 50 && count <= MAX) /* 文件2所占的范圍 */
72 {
73 if ((ch2 == EOF) || (ch2 == '\n'))
74 {
75 fprintf(stdout, "%c", ' ');
76 }
77 else
78 {
79 fprintf(stdout, "%c", ch2);
80 ch2 = fgetc(fp2);
81 }
82 }
83
84 }
85
86 if (ch1 == '\n') /* 如果ch1是換行符時,要是不獲取下一個字符,則將會一直輸出空格 */
87 ch1 = fgetc(fp1);
88 if (ch2 == '\n')
89 ch2 = fgetc(fp2); /* ch2也是一樣,兩者不能合並在一起,因為這是獨立的 */
90
91 fprintf(stdout, "%c", '\n');
92 if ((ch1 == EOF) & (ch2 == EOF)) /* 退出條件 */
93 break;
94 }
95 }
View Code
再用兩個測試文件來打開,輸出在終端,你也可以修改輸出到文件中。下面給出結果:

其實道理很簡單,但一定要注意換行符的問題。我就試過每一行就吞了一個字母,那是因為換行獲取一個字符時在下一次輸出的時候又獲取了字符,就覆蓋了。只有在該換行的時候才能執行那個獲取下一字符的表達式。
可以改進的地方:這個程序只支持ascll碼,要是漢字的話就會出現亂碼,因為漢字好像是占兩個字節的吧。還有,可以在程序的後面加一個計數,計算每一行共由多少個除空格以外的字符。
本人新手,說錯的地方望指出,謝謝。