ifstreamクラスとistreamクラス
こんにちは。
C++について質問させて下さい。
コンパイラは、Borland C++ Compiler 5.5 を使用しています。
僕は、ifstreamとfstreamクラスは、istreamクラスから派生していると認識しています。
つまり、istream型のポインタや参照は、ifstream型オブジェクトもfstream型オブジェクトも指す事ができるはずです。
その事を確認するために、まず、以下のような内容の入力マニピュレータを作成しました。
------------------------------------------------------------
istream &alphabet(istream &stream)
{
char ch;
do{
ch=stream.peek();
if(!isalpha(ch))
stream.get(ch);
}while(!isalpha(ch) && !stream.eof() );
return stream;
}
------------------------------------------------------------
この入力マニピュレータは、
ifstream fin("test.txt");
のようにして作成されたifstream型オブジェクトのfinと、
char str[80];
のようにして作成された文字列変数strに対して、
fin >> alphabet >> str;
のように使うと、finに結び付けられたファイルtest.txtの現在位置(getポインタの位置)から、
次にアルファベットが現れるまで、アルファベット以外の文字を捨て去ることで、
アルファベットではじまる単語をstrに格納する事ができます。
また、この入力マニピュレータは、istream型オブジェクトへの参照を受け取るので、
fstream finout("test.txt");
のようにして作成されたfstream型オブジェクトのfinoutに対して、
fin >> alphabet >> str;
のように使っても、問題なく動作しました。
つまり、上のマニピュレータの場合は、istream型オブジェクトへの参照を、
引数として受け取るようにしてあるので、istreamクラスから派生している、
ifstreamクラスのオブジェクトや、fstreamクラスのオブジェクトを渡す事ができています。
次に、以下のような内容の、ifstream型オブジェクトへの参照を受け取る関数を作成しました。
void file_to_str(ifstream &file, char *str)
{
const int size=1000;
char temp[size]="";
do{
file.getline(temp, size);
strcat(str, temp);
if(!file.eof())
strcat(str, "\n");
}while(!file.eof());
}
この関数は、
ifstream fin("test.txt");
のようにして作成されたifstream型オブジェクトのfinと、
char str[1000];
のようにして作成された文字列変数strに対して、
file_to_str(fin, str);
のように使うと、finに結び付けられたファイルtest.txtの内容を、
文字列変数strに格納する事ができます。
ここで、上の関数のプロトタイプを
void file_to_str(ifstream &file, char *str);
から
void file_to_str(istream &file, char *str);
に変更してみると、プログラムをコンパイルした時に、以下のようなエラーが発生します。
------------------------------------------------------------
C:\Users\kei\work\C++
>bcc32 file_to_str.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
file_to_str.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'file_to_str(std::basic_fstream<char, std::char_traits<char>
>&, char *)' が未解決(C:\USERS\KEI\WORK\C++\FILE_TO_STR.OBJ が参照)
------------------------------------------------------------
file_to_str.cppには、上の関数が定義されていて、
そのmain関数の内容は、以下の通りです。
------------------------------------------------------------
void main(void){
ifstream fin("test.txt");
char str[1000];
file_to_str(fin, str);
}
------------------------------------------------------------
コンパイルエラーは、
file_to_str(fin, str);
の行で発生しています。
なぜ、入力マニピュレータの時は、仮引数をistream型オブジェクトへの参照にしてもOKだったのに、
関数の場合はコンパイルエラーが発生するのかが分からず、困っています。
理屈的には、何度も言っているように、istreamクラスからfstreamクラスとifstreamクラスが派生しているので、全然問題が無いように思えます。
何か御存じの方がいらっしゃれば、是非、情報を提供して頂きたく思います。
では、よろしくお願い致します。
お礼
遅くなりましたが、回答ありがとうございました。officeの再インストールしましたが、やはり、だめでした。同じCDをもらった方に聞いたら何かロックを一杯はずしたらみれたそうです。その簡単に開けるようになったCDを貰うことにしたので、まだ、リカバリはしていません。それを見て考えてみます。