- ベストアンサー
ファイル名リストの置換処理
- 取得したファイルリストを文字列で入れ替える方法について
- ファイルリストの中で最初の位置の文字列を特定の名前で置き換える方法
- ファイル名リストの取得と置換処理に関する実装例
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
なんか仕様が増えたーー!? > 実はファイル自体存在させる個数が決まっており、ファイルのリストを一度作成した場合、後はリストに新規作成したファイルを追加するようにしたかったのです。 > ですから、10個のリストになった場合にサイクリックに、今度は先頭から上書きして、古いファイルから消していくような仕様でした。 > その際実際存在する古いファイルも消すという内容です。 そういう仕様であるならば、なおさらファイル名の「上書き」メソッドは実装すべきではありません。そもそもファイル名の並びは最終更新日時の古い順のはずです。それを外部から書き換え可能にしてしまったら順番がばらばらになってしまいます。 実装すべきはファイルリストへの追加処理でしょう。とりあえず以下にファイル名のみ追加するものを書きましたが、クラスの役目を考慮して、この処理の中で実ファイルの作成・削除も行うというてもあります。 void DML_Backup::add(const string& filename) { files_.push_back(filename); int erasing_files = files_.size() - 10; if (0 < erasing_files){ files_.erase(files_.begin(), files_.begin() + erasing_files); } } ……でも、これだったらコンテナはvectorよりもlist(ただしoperator[]の書き換えが必要)やdequeのほうがいいような気がしますが。
その他の回答 (4)
- hitomura
- ベストアンサー率48% (325/664)
> これは例えば日付が古い順にソートした場合、リストの個数に上限があり、上限に達した場合、リストの先頭に戻り、順番に新しいファイルを上書きして行くという処理です。 何かおかしいと思ったら、そういうことですか。 このDML_Backupクラスの場合、外部からファイル名を書き換えるメソッドは不要です。というか、作ってはいけません。 なぜならば、このクラスで保持しているファイル名はsearchメソッドで検索したものであり、ディスク等にあるファイルという実体があります。外部からファイル名を書き換えると、その実体からクラス内のデータを乖離させることになります。 したがって、そのメソッドで元の名前のファイルを新しいファイル名に変更する処理を同時に行うのでない限り、外部からファイル名を書き換えるメソッドを作るべきではありません。 「リストの個数に上限があり」云々という制限はデータを表示する側の都合であり、データを表示する側で対処すべきです。たとえば以下(逐次処理を行って進捗をリストに表示する)のように処理を行うファイルのインデックスをリストの表示可能行数で割った余りでファイル名を書く行が求められます。 const int ListLines = 10; // リストの表示可能行数 int main() { DML_Backup dml; dml.search("*.ecd"); for (int i = 0; i < dml.size(); i++){ int disp_line = i % ListLines; // リストの disp_line 行に dml[i] を書く // ファイル dml[i] に対して処理実行 } }
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> string operator[](int inx) const { return files_.at(inx).c_str(); } コレ↑を書き換え: string operator[](int inx) const { return files_.at(inx); } string& operator[](int inx) { return files_.at(inx); } ってするだけでよくね? # 教本買って「ちゃんと」勉強することを強くお勧めします。
- hitomura
- ベストアンサー率48% (325/664)
質問とは直接関係ありませんが、 string operator[](int inx) const { return files_.at(inx).c_str(); } は c_str() が余計で、 string operator[](int inx) const { return files_.at(inx); } で十分です。
- gerugugu84
- ベストアンサー率37% (29/78)
void DML_Backup::replace( const char* pstr ) { vector<string>::iterator it = files_.begin(); if( files_.end() != it ) { *it = pstr; } } int main() { DML_Backup dml; char EcoDataFileName[]="MonJun131956122011.ecd"; // 先頭のstringを置き換える dml.replace(EcoDataFileName); }
補足
ありがとうございます。では先頭から適宜、順番に任意の文字列に差し替えるにはどうすれば良いでしょうか?これは例えば日付が古い順にソートした場合、リストの個数に上限があり、上限に達した場合、リストの先頭に戻り、順番に新しいファイルを上書きして行くという処理です。わかりにくくてすみません。
補足
ありがとうございます、実はファイル自体存在させる個数が決まっており、ファイルのリストを一度作成した場合、後はリストに新規作成したファイルを追加するようにしたかったのです。ですから、10個のリストになった場合にサイクリックに、今度は先頭から上書きして、古いファイルから消していくような仕様でした。その際実際存在する古いファイルも消すという内容です。そのような理由で質問をさせて頂いておりました。