※ ChatGPTを利用し、要約された質問です(原文:fstream型オブジェクトを関数の仮引数にする)
C++のfstream型オブジェクトを関数の仮引数にする方法は?
このQ&Aのポイント
C++のプログラムで、fstream型・ifstream型・ofstream型のオブジェクトを関数の仮引数にする方法を知りたいです。
具体的には、ファイルの内容を1つの文字列変数に格納する関数を作成したいです。
現在、fstream型のオブジェクトを関数に渡そうとしたところ、エラーが発生しました。何か解決策はありますか?
こんにちは。
現在、C++を使ってプログラミングをしているのですが、fstream型・ifstream型・ofstream型のオブジェクトを、関数の仮引数にするにはどうすればよいのか分からず困っています。
具体的に言いますと、まず、main関数の中で
fstream file("test.txt"); のように、fstream型オブジェクトfileを定義しておき、これを以下のような関数に渡して、関数の内部で使いたいのです。
(以下の関数は、ファイルの内容を、1つの文字列変数に格納するためのものです。)
________________________________________________________________________________________________________________________
void file_to_str(fstream file, char *str){
const int size=10000;
str=""; //初期化しとかないとダメ。
char temp[size]=""; //初期化しとかないとダメ。
while(!file.eof()){
file.getline(temp, size); //改行に出会うかsize個の文字を読み込むまで、 //文字をバtemp)に読み込む。
strcat(str, temp);
if(!file.eof()){
strcat(str, "\n"); //getline()関数は改行をバッファに読み込まない。
}
}
}
________________________________________________________________________________________________________________________
この関数を、main関数でfstream file("test.txt"); と記述した直後で呼び出した所、以下のようなエラーが出ました。
________________________________________________________________________________________________________________________
エラー E2247 file_to_str.cpp 48: 'ios::basic_ios(const ios &)' はアクセスできな
い(関数 fstream::basic_fstream(fstream &) )
エラー E2247 file_to_str.cpp 48: 'ios::basic_ios(const ios &)' はアクセスできな
い(関数 iostream::basic_iostream(iostream &) )
エラー E2125 file_to_str.cpp 48: コンパイラは 'copy constructor' クラスの istrea
m を作成できない(関数 iostream::basic_iostream(iostream &) )
エラー E2125 file_to_str.cpp 48: コンパイラは 'copy constructor' クラスの ostrea
m を作成できない(関数 iostream::basic_iostream(iostream &) )
________________________________________________________________________________________________________________________
何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。
(「このプログラムの場合は、FILE型ポインタで代用できる。」といった答え以外でお願い致します。)
では、よろしくお願い致します。
お礼
大変御丁寧な御回答、ありがとうございます。 しばらくC++から遠ざかっていたもので、値呼び出しの時に、コピーコンストラクタが呼び出される事などを忘れていました。 御提案頂いた通り、C++の参照呼び出しを使うと上手く行きました。 「str=""; //初期化しとかないとダメ。」 という1行は、初歩的なミスですね。(笑) これを消さないと上手く行きませんでした。 適切すぎる御説明、御見事でした。