あなたは非常に不健全な方法で C と C++ を混ぜているのではないかと心配しています。
まず、std::string
の代わりに を使用することを心からお勧めしchar*
ます。信じてください。問題がはるかに少なくなります。
次に、ポインターに注意する必要があります。注意しないと、「ライブ」オブジェクトをホストしなくなったメモリ内の場所を指す可能性があります。
次のコードを提案します。
void execute(std::ostream& out) {
out << "test\n";
} // execute
int main(int argc, char* argv[]) {
if (argc == 1) {
execute(std::cout);
return 0;
}
std::string filename = argv[1];
filename += ".log";
std::ofstream file(filename.c_str());
execute(file);
return 0;
}
これは、陥った 2 つの落とし穴を回避する方法を示しています。
- を使用する
std::string
と、静的なサイズのバッファーを割り当てることが回避されるため、バッファー オーバーフローのリスクが生じます。さらに、操作はとても簡単です。
- 関数を使用して印刷ロジックを引き上げ、ポインターとそれがもたらす微妙な問題を取り除きます。
std::string
現時点では、 and std::fstream
(および配偶者) がうまく混ざり合っていないのは残念です。歴史的な欠陥... 私の記憶が正しければ、C++0x で修正されました。