はじめに、質問内容が錯綜気味であることをお許しください。問題の切り分け自体に困難を覚えている状態で、藁をもすがりたいという思いで質問させて頂きます。
Visual Studioを使って他人が書いたC++のプログラムを読んでいるのですが、その中で、**「char*型の引数filenameが名前のファイルを新しく作って、書き込み処理をして保存する」**という目的で、以下のようにofstreamを使った関数があります:
void createFile(const char* filename){ ofstream file; file.open(filename); //以下、ファイルの書き込み処理 }
このスニペットでは、もし引数に指定した新規ファイル名と同じ名前のファイルが該当のディレクトリに存在する場合、そのファイルの中身を上書きしてしまう、というものでした。
これを避けるために、よくあるように**「同名のファイルが作成されようとしている場合、その新規ファイルのファイル名について、そのファイル名の末尾に数字を付け足すことで上書きを回避する」という機能を付けようと思いました**。そのために、このサイトを真似して、まず最初に引数のfilenameと名前が一致するファイルがディレクトリに存在するかチェックして、存在しなければそのまま通して、存在するならば名前が一致しなくなるまでfilenameの中身に数字をつけ足す、というコードを実装しようとしました:
void createFile(char* filename){ // filenameと一致するファイルが存在するかチェック ifstream fileCheck; fileCheck.open(filename); for(int i=1;;i++){ if(!fileCheck.fail()){//同名ファイルが既に存在していた場合 //名前が一致するファイルがなくなるまでfilenameの中身を更新 *filename = *filename + '_' + i; }else{//同名ファイルが存在しない場合 fileCheck.close(); break; } } ofstream file; file.open(filename); //以下、ファイルの書き込み処理 }
引数filenameの中身を書き換えることになるので、データ型をconst char*からconstを取り外してchar*単体に変更しました。
しかし、*filename = *filename + '_' + i;の個所で、データ型に関するエラーが発生します。
(事情があり、いま元のエラーメッセージの原文を表示することが出来ません。申し訳ありません。)
私の憶測ですが、filename がchar*型にもかかわらず、char型である*filenameの中に複数のchar型およびint型の値を連結してできたstring型の値を代入している、ということでしょうか?
char*型というデータ型について理解できていないのが原因だと思い、調べたのですが、よくわかりません。以下に、私が行った試行錯誤を示します:
- はじめ、
char*を単に「char型のポインター」だと思い、「char型なら『文字』であって、『文字列』ではないから、そもそもfilenameに『ファイルの名前という文字列』を代入するのは不可能ではないか?」と思いました。しかし、このソースコードでこのcreateFile関数を使っている場面では、普通にstring型の値を放りこんでおり、混乱しました。 - あるサイトの解説によると「
char*型はstring型が出来る前の昔の記法」ということだったので、string型として使ってよいのかと思いました。 - しかし、上のエラーのように、
*filenameの中にstringを放り込もうとすると、怒られます。
何が間違っているのでしょうか?
大変説明不十分で錯綜気味な質問で申し訳ないですが、ご回答頂けると幸いです。
回答5件
あなたの回答
tips
プレビュー