
こんにちは。
現在、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型ポインタで代用できる。」といった答え以外でお願い致します。)
では、よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
C++でクラスを使ったプログラミング、どれくらいやってますか?
> void file_to_str(fstream file, char *str)
のように書いたら、値呼び出しなので、fstreamオブジェクトのコピーが作られる、というのは理解してますか?
このようなオブジェクトのコピーに呼び出されるのがcopy constructor(コピーコンストラクタ)です
で、ファイルの管理がばらばらにならないように、コピーできないようにしてあるのが、エラーの原因です。
Cからの方法であるポインタを使うか
void file_to_str(fstream *file, char *str)
(定義中の file.XX → file->XX 、 呼び出しはfile_to_str(&file,str) )
C++で追加された参照呼び出しを使うか
void file_to_str(fstream &file, char *str)
これは、他のオブジェクトでも同様です。fstreamのようにコピーが禁止されているものばかりではありませんが
・コピーに対しての処理でいいのか?処理がいいのか?
・同じオブジェクトに対して処理をしなければならないのか?
を考えて作りましょう。
あと
> str=""; //初期化しとかないとダメ。
これはfile_to_str関数内でのローカル変数 char *str に 文字列リテラル"" のアドレスを入れているだけです。呼び出し側のstrのアドレスがわからなくなってしまうだけでなく、おそらく定数用の領域に確保された文字列リテラル""のアドレスへ書き込もうとします。
ポインタの使いかた、char*を使った文字列の使いかたをもう一度見直しては?
大変御丁寧な御回答、ありがとうございます。
しばらくC++から遠ざかっていたもので、値呼び出しの時に、コピーコンストラクタが呼び出される事などを忘れていました。
御提案頂いた通り、C++の参照呼び出しを使うと上手く行きました。
「str=""; //初期化しとかないとダメ。」
という1行は、初歩的なミスですね。(笑)
これを消さないと上手く行きませんでした。
適切すぎる御説明、御見事でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- その他(プログラミング・Web制作) pythonのエラーについて 2 2022/08/17 17:17
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char型にint型の数値を代入する。
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語を用いた環境変数の作成/...
-
csvファイルを構造体に格納した...
-
fread()関数とfwrite()関数につ...
-
置換について
-
文字列の途中から途中までを抽出
-
文字列str内の全ての数字を...
-
fgetc( )の戻り値はなぜ整数??
-
const char* s1とただのchar s1...
-
文字列ポインタと配列の違いで...
-
C言語のintとcharの違いってな...
-
VBからCで作成されたDLL...
-
文字列内の数字削除
-
C言語 strstrの実装
-
szとlpszの違い
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
DWORDとcharの変換
-
C++17で、unsigned char * 配列...
-
char 文字列型 の表現範囲が-12...
-
new charとnew char[N]の違いは?
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
小数点入りの文字列をfloat型に...
-
文字型配列に格納した空白の切捨て
-
fstream型オブジェクトを関数の...
-
C++Builder 2009 テキスト...
-
文字列の途中から途中までを抽出
-
C言語の文字リテラル中の16進文...
-
エクセルのMID関数は、C言語では?
-
文字列のswap
-
void型へのポインタ
-
VC++ char[10]へのCString値の代入
おすすめ情報