![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 14:39 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 我用TC寫的一個readme程序,大家看一下 |
| 可打印版本 1,136 / 1 |
| 第1楼 bush | 发表于 2004-09-21 00:00 |
| 银牌会员 发帖 730 积分 2,165 | |
|
我用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 = (char*) malloc(80); if(!row) { printf("out of memory!\n" ;return 1; } for(j = 0; j < 79; j++) row = ' '; row = '\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 = c; if(j == 79) /* 讀滿一行的處理: * 行寬80、末字符是'\0' * */ { if(hz) /* 避免半個漢字現象, * 退一格把一度的漢字高位改到下一行 * */ { row = ' '; 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 = (char*) malloc(80); if(!row) { printf("out of memory!\n" ;return 1; } for(j = 0; j < 79; j++) row = ' '; row = '\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); 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); /* 釋放二維數組 */ free(row); return 0; } |
|
| 第2楼 bush | 发表于 2004-09-21 00:00 |
| 银牌会员 发帖 730 积分 2,165 | |
|
這里貼代碼真是纍!改了兩遍,把 變量 i 改成k,才沒走樣
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |