カテゴリー
C C++

C++,Cで遊んでました。C++Builder入門、実習C言語

//#include <condefs>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
#pragma hdrstop

int main(int argc, char** argv)
{
	char buff[81];	//漢字大丈夫?
	ifstream infile;
	infile.open("readfile.cpp");
	if (!infile) return 0;
	while (!infile.eof()) {
		infile.getline(buff, sizeof(buff));
		cout << buff << endl;
	}

	infile.close();
	cout << endl << "Press any key to continue...";
	//getch();
	return 0;
}

上はC++Builder入門のサンプルコード。自分自身を表示します。

/*
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;
}

上は三田典玄さんのサンプルコード。表示するファイル名をstaticで確保してます。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string.h>

using namespace std;
#pragma hdrstop

#define MAXFILES 5
#define MAXLINES 10

class FileNameArray
{
public:
	FileNameArray();
	~FileNameArray();
	char* getFname() { return fname; }
	void setFname(char* fn) { strcpy(fname, fn); }
private:
	char fname[40];
};

FileNameArray::FileNameArray()
{
	strcpy(fname, "end");
}

FileNameArray::~FileNameArray()
{
} 

int InputFileName(FileNameArray* fnm[]) {

	for (int i = 0; i < (MAXFILES - 1); i++) {
		char w[40];
		cout << i + 1 << " FileName: ";
		cin >> w;

		fnm[i]->setFname(w);
		if (strcmp(w, "end") == 0) {
			return -1;
		}
	}
	return 0;
}

void PrintFileName(FileNameArray* fnm[]) {
	for (int i = 0; i < MAXFILES - 1; i++) {
		cout << i + 1 << " :FileName: ";
		cout << fnm[i]->getFname() << endl;
		if (strcmp(fnm[i]->getFname(), "end") == 0)
			break;
	}
}

int PrintFileStop(FileNameArray* ptr[]) {
	char buff[81];

	for (int i = 0; i < MAXFILES - 1; i++) {
		ifstream infile;
		char w[40];
		int lcnt = 0;
		strcpy(w, ptr[i]->getFname());
		if (strcmp(w, "end") != 0) {
			infile.open(w);
			if (!infile) return -1;
			while (!infile.eof()) {
				infile.getline(buff, sizeof(buff));
				cout << buff << endl;
				lcnt++;
				if (lcnt > MAXLINES)
					break;
			}
		}
		else {
			infile.close();
			break;
		}
		infile.close();
	}
	return 0;
}

int main(int argc, char** argv)
{
	FileNameArray* fnab[MAXFILES];
	for (int i = 0; i < (MAXFILES - 1); i++)
		fnab[i] = new FileNameArray();

	InputFileName(fnab);

	char msg[40];
	(PrintFileStop(fnab) != 0) ? (strcpy(msg, "異常")) : (strcpy(msg, "正常"));
	cout << msg << "終了しました。";
	cout << endl << "Press any key to continue...";
	return 0;
}


上は見様見真似で弄り回した自分で書いたもの。ファイル名を入れておくところをclassで作って、mainに置いてます。それらはポインタの配列で、必要なルーティンへ渡します。PrintFileStopはほぼ、C++Builder入門のコードと同じです。

inserted by FC2 system