- ベストアンサー
C++のifstreamクラスとistreamクラスについての質問
- C++のifstreamクラスとistreamクラスについて質問があります。
- ifstreamクラスとfstreamクラスはistreamクラスから派生していると考えています。
- ifstreamやfstreamのオブジェクトを引数とする入力マニピュレータや関数が問題なく動作する一方、istreamへの参照を引数に取る関数ではコンパイルエラーが発生します。なぜでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2のお礼に記載のコードを BCC55でコンパイルorリンクを行いましたが質問のような現象には遭遇しませんでしたよ 一部変更/修正が必要でしたが … // ヘッダーファイルの指定を追加 #include <iostream.h> #include <fstream.h> void file_to_str(istream &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()); } void main(void) { // fstreamをifstreamに修正 ifstream file("test.txt"); char str[10000]=""; // 変数pをstrに修正 file_to_str(file, str); } といった具合です … >bcc32 BCSTL001-test.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland BCSTL002-test.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
それら全体を 1つのファイルにして g++ に食わせたら (いくつか修正しなきゃならんけど) コンパイルできました. とはいえ, 「main の内容」が違っていたりするのが謎. もとの質問では ifstream なのに, #2 に対して出てきたプログラムだと fstream になってる. 「プロトタイプを変更したプログラム」の全体は本当にそれであってますか? そして, 本当にエラーメッセージはもとの質問に挙がっている通りですか?
お礼
Tacosanさん 御返信ありがとうございます。 >「main の内容」が違っていたりするのが謎. もとの質問では ifstream なのに, #2 に対して出てきたプログラムだと fstream になってる. 分かりにくくて申し訳ありません。 #2では、書き換えた方のプログラムを、記載しましたので、 最初の質問フォームに記載したコードは無視してもらっても構いません。 書き換えた方のプログラムで file_to_str(file, p); の部分が間違っているので file_to_str(file, str); に修正しておいてください。 あと、 書き換えた方のプログラムで表示されるエラーは、 Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland file_to_str-test.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\DESKTOP\FILE_TO_STR-TEST.OBJ が参照) です。 >それら全体を 1つのファイルにして g++ に食わせたら (いくつか修正しなきゃならんけど) コンパイルできました. 御手間をお掛けしますが、どのように修正すればよいのか、教えて頂けますでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず「プロトタイプを変更した」あとのプログラムを全部だしてください.
お礼
御回答ありがとうございます。 プロトタイプを変更した後のプログラムですね。 file_to_str関数とmain関数の両方を、一応記載しておきます。 ----------------------------------------------------------- void file_to_str(istream &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()); } void main(void) { fstream file("test.txt"); char str[10000]=""; file_to_str(file, p); } ----------------------------------------------------------- 何か分かりましたら、よろしくお願い致します。
- redfox63
- ベストアンサー率71% (1325/1856)
コンパイルエラーじゃなくて リンクエラーですよね ということは 引数書き換えたときに 関数名を変更してしまったなんてことありませんか 今あるブロック(file_to_str)をコメントアウトしておいて 関数をもう一度書いてみてはいかがでしょう どこかにケアレスミスがあると思うんですけどね …
お礼
御回答ありがとうございます。 仰っている内容から考えると、 「僕は、ifstreamとfstreamクラスは、istreamクラスから派生していると認識しています。 つまり、istream型のポインタや参照は、ifstream型オブジェクトもfstream型オブジェクトも指す事ができるはずです。」 という部分は、間違っていないと考えてもいいのでしょうか? あと、file_to_str関数ですが、プロトタイプの第一引数の型を、ifstream&から istream& に変更しただけであり、関数名や、その内容は全く変更していません。
お礼
御回答ありがとうございます。 何が悪かったのか分かりました。 main関数を含むプログラムでインクルードしている、 ヘッダファイルに記述してあるfile_to_str関数のプロトタイプが、 file_to_str(istream &file, char *str); ではなく、 file_to_str(ifstream &file, char *str); file_to_str(fstream &file, char *str); となって事が原因だったようです。 Tacosanさん、redfox63さん ご協力頂き、ありがとうございました。