中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 我用TC寫的一個readme程序,大家看一下
作者:
标题: 我用TC寫的一個readme程序,大家看一下 上一主题 | 下一主题
bush
银牌会员




积分 2165
发帖 730
注册 2004-4-21
状态 离线
『楼 主』:  我用TC寫的一個readme程序,大家看一下 使用 LLM 解释/回答一下


很多软件的自述文件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"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
if(!fp)
{
printf("Can't find readme.txt!\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
return 2;
}
row = (char**) malloc(20 * sizeof(void *));
if(!row)
{
printf("out of memory!\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
return 1;
}
for(k = 0; k &lt; 20; k++) /* 動態建立二維數組:
*並初始化為寬度80的空白行
* */
{
row = (char*) malloc(80);
if(!row)
{
printf("out of memory!\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
return 1;
}
for(j = 0; j &lt; 79; j++) row = ' ';
row = '\0';
}
j = r = 0;
c = getc(fp);
while(c != EOF)
{
while(c != '\n' &amp;&amp; c != EOF &amp;&amp; r &lt; maxrow) /* 從文件中逐個讀入字符到數組中
* */
{
if(isascii(c));
else
hz = ~hz; /* 中文字符翻轉hz標記 */
if(c == '\t') /* TAB字符轉換為空格 */
for(k = 0; k &lt; TAB &amp;&amp; j &lt; 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"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
return 1;
}
for(; r &lt; maxrow; r++)
{
row = (char*) malloc(80);
if(!row)
{
printf("out of memory!\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
return 1;
}
for(j = 0; j &lt; 79; j++) row = ' ';
row = '\0';
}
r -= 20; /* 上面for循環r已經增大, * 衝置為實際行數
* */
j = 0;
}
}
fclose(fp);
p = maxrow / 20;
for(j = 0; j &lt; p<img src="images/smilies/face-wink.png" align="absmiddle" border="0">
{
printf("Display page: %hd/%hd\n", j + 1, p);
for(k = 0; k &lt; 20; k++) /* 按數組内容顯示: * 把每一行作爲一個字符串
* */
printf("%s\n", row);
printf("\nPress U to uppage, E to end;other key continue..\n"<img src="images/smilies/face-wink.png" align="absmiddle" border="0">;
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 &lt; maxrow; k++) free(row); /* 釋放二維數組 */
free(row);
return 0;
}



2004-9-21 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
bush
银牌会员




积分 2165
发帖 730
注册 2004-4-21
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

這里貼代碼真是纍!改了兩遍,把 變量 i 改成k,才沒走樣


2004-9-21 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: