中国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程序,大家看一下


很多软件的自述文件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编辑过]




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




积分 2165
发帖 730
注册 2004-4-21
状态 离线
『第 2 楼』:  

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

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

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


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



论坛跳转: