标题: 我用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,才沒走樣