Board logo

标题: 我用TC寫的一個readme程序,大家看一下 [打印本页]

作者: bush     时间: 2004-9-21 00:00    标题: 我用TC寫的一個readme程序,大家看一下

很多软件的自述文件README.TXT可以用同目錄的README.EXE能方便地阅读,能实现上翻一页、下翻一页, 我寫了一個簡單的,大家試一下看有什麽問題? {點這裡下載} 使用方法是放到readme.txt相同目錄下,運行。 * 分葉顯示時,按'U'上翻,其他按鍵下翻。 * 按'E'可以終止顯示。 如果按PageUp等鍵程序都會下翻兩葉 ~o~ 是因爲我沒找到識別他們的函數,程序祗認ascii鍵~:~ 後邊是代碼。 / * 本程序用於顯示當前目錄下的readme.txt文檔 */ #include <stdio.h> #include <ctype.h> #define TAB 6 /* 製表站寬度 */ /* ============================================= =============================================== */ int main(void) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ FILE* fp; char ** row; unsigned short p, r, k, j, maxrow = 20; char c, hz = 0; /* 二次指針row用於建立數組緩衝寫屏信息 * r用於記行數 p記錄葉數 * maxrow當前最大行數用於動態分配内存 hz標記中文字符 * 由於每個漢字占兩個字節所以讀到漢字高位時hz置位、讀到低位時清零可以表示讀完一個漢字 */ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ fp = fopen("readme.txt", "r"; if(!fp) { printf("Can't find readme.txt!\n"; return 2; } row = (char**) malloc(20 * sizeof(void *)); if(!row) { printf("out of memory!\n"; return 1; } for(k = 0; k < 20; k++) /* 動態建立二維數組: *並初始化為寬度80的空白行 * */ { row[k] = (char*) malloc(80); if(!row[k]) { printf("out of memory!\n"; return 1; } for(j = 0; j < 79; j++) row[k][j] = ' '; row[k][79] = '\0'; } j = r = 0; c = getc(fp); while(c != EOF) { while(c != '\n' && c != EOF && r < maxrow) /* 從文件中逐個讀入字符到數組中 * */ { if(isascii(c)); else hz = ~hz; /* 中文字符翻轉hz標記 */ if(c == '\t') /* TAB字符轉換為空格 */ for(k = 0; k < TAB && j < 79; k++, j++); else row[r][j++] = c; if(j == 79) /* 讀滿一行的處理: * 行寬80、末字符是'\0' * */ { if(hz) /* 避免半個漢字現象, * 退一格把一度的漢字高位改到下一行 * */ { row[r][78] = ' '; hz = 0; /* 清零為下一行初始化 */ } else if((c = getc(fp)) == '\n') c = getc(fp); /* 有的句子剛好有79字節, * 則把末尾的'\n'略去, * 以免被調整到下一行行首形成多餘的空行 * */ j = 0; r++; } else c = getc(fp); } if(c == '\n') /* 未讀滿一行但遇到換行符的處理 */ { j = 0; r++; } if(c != EOF) c = getc(fp); if(r == maxrow) /* 讀滿一屏内容, * 擴充數組準備讀下一屏 * */ { maxrow += 20; row = (char**) realloc(row, maxrow * sizeof(void *)); if(!row) { printf("out of memory!\n"; return 1; } for(; r < maxrow; r++) { row[r] = (char*) malloc(80); if(!row[r]) { printf("out of memory!\n"; return 1; } for(j = 0; j < 79; j++) row[r][j] = ' '; row[r][79] = '\0'; } r -= 20; /* 上面for循環r已經增大, * 衝置為實際行數 * */ j = 0; } } fclose(fp); p = maxrow / 20; for(j = 0; j < p { printf("Display page: %hd/%hd\n", j + 1, p); for(k = 0; k < 20; k++) /* 按數組内容顯示: * 把每一行作爲一個字符串 * */ printf("%s\n", row[j * 20 + k]); printf("\nPress U to uppage, E to end;other key continue..\n"; switch(k = getch()) { case 'u': case 'U': /* 閲讀多業文本時可以按'U'回顯上一葉 * */ if(j) j--; break; case 'E': /* 按'E'結束閲讀 */ case 'e': j = p; break; default: j++; } } for(k = 0; k < maxrow; k++) free(row[k]); /* 釋放二維數組 */ free(row); return 0; }

[此贴子已经被作者于2004-9-21 23:09:27编辑过]


作者: bush     时间: 2004-9-21 00:00
這里貼代碼真是纍!改了兩遍,把 變量 i 改成k,才沒走樣