/*
Chotto.c multifile cat. procedures
Designed & created by N.Mita 1986/05/28 Copyright Core Dump Co,.Ltd.
*/
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define CLS cls()
//画面を消去する関数を呼ぶマクロ
#define MAXFILES 128 //このプログラムで扱えるファイル数の最大値256
#define MAXLINES 256 //このプログラムで扱える1行の文字数の最大値
static char file_name[MAXFILES][40]; //ファイル名を入れておくバッファ
FILE* fp; //ファイル構造体へのポインタ
void cls()
{ //・・画面を消去する関数(どの処理系でも対応できるように、 25 行空行を送るだけにしてある)
int i;
for (i = 0; i < 25; ++i) printf("\n");
}
int open_file(fname) //ファイルをオープンする関数
char fname[];
{
if (NULL == (fp = fopen(fname, "r")))
return(0);
else
return(1);
}
void close_file() //ファイルをクローズする関数
{
fclose(fp);
}
void cat_file(line) // ......... ファイルの内容を指定行数だけ表示する関数
int line; /* number of display lines*/
{
int i, j;
char line_buff[MAXLINES]; /* display line-buffer */
for (i = 0; i < line; ++i) //....... 1行を処理するループ
{
if (NULL == fgets(line_buff, MAXLINES, fp)) // 1行を読み込み、エラーが起きた
{ //かどうか判断する
if (feof(fp)) break; //ファイルの終わりならば for ループを抜ける
if (ferror(fp))
{
printf(">>>>>>> Read-ERROR on FILE <<<<<<<\n");
break;
}
} //エラーであれば 処理を中断して終了
for (j = 0; j < MAXLINES; ++j) //......... ファイルから読み込んだ行を表示する
{
if ((int)NULL == line_buff[j]) break; //読めない文字があった場合は、 .ピリオド
if ((isspace(line_buff[j])) || (' ' <= line_buff[j]))
putchar(line_buff[j]);
else
putchar('.');
}
}
}
int disp_1file(fname, n) //指定されたファイルを表示する関数
char fname[]; /* file-names for display */
int n; /* number of display-lines */
{
if (!open_file(fname))
{
printf("******* Cannot open file: %20s ******\n", fname);
return(0);
}
else
{
printf("-------- FILE : %20s --------\n", fname);
cat_file(n);
printf("\n\n");
}
close_file();
return (1);
}
void disp_file(m, n) //・指定された複数ファイルを表示する関数
int m; /* Number of files */
int n; /* Number of lines */
{
int i; char dummy[40];
for (i = 0; i < m; ++i)
{
disp_1file(&file_name[i][0], n);
puts("Press return...........");
gets(dummy);
}
}
int input_file() //ファイル名の入力関数
{
int i;
CLS;
for (i = 0; i < MAXFILES; ++i)
{
printf("%5d: FILE-NAME=", i + 1);
gets(&file_name[i][0]);
if (0 >= strlen(&file_name[i][0])) break;
}
return(i);
}
int input_line() //表示行数の入力関数
{
char i_str[40];
printf(" : LINES ? = ");
gets(i_str);
return(atoi(i_str));
}
int main() //・・・・・・メインの関数. できるだけシンプルになっていることが望ましい
{
int i, j;
if (0 >= (i = input_file())) //.....・ファイル名の入力
{
printf("******* No files *******\n");
exit(0);
}
else
{
if (0 >= (j = input_line())) // 表示行数の入力
{
printf("******* No lines *******¥n");
exit(0);
}
disp_file(i, j); //......... 実際の処理
}
printf("------- Complete. -------\n"); //作業終了の表示
return 0;
}