【发布时间】:2021-01-28 17:08:47
【问题描述】:
考虑以下 C 代码:
void openFile(const char *mode, char *filename, FILE **fileptr)
{
...
*fileptr = fopen(filename, mode);
...
}
FILE *logstream;
if (LOG_FILE_ENABLED)
{
openFile("w", "mylogfile.txt", logstream);
}
else
{
logstream = stderr;
}
fprintf(logstream, "[DEBUG] Some debug message...\n");
fclose(logstream);
我正在尝试将其翻译成惯用的 C++。我怎样才能重载openFile() 使其需要std::ofstream,但保持logstream 流不可知?我假设它会是这样的:
void openFile(const char *mode, char *filename, std::ofstream &ofs)
{
...
ofs.open(filename);
...
}
std::ostream logstream;
if (LOG_FILE_ENABLED)
{
logstream = std::ofstream();
openFile("w", "mylogfile.txt", logstream);
}
else
{
logstream = std::cerr;
}
logstream << "[DEBUG] Some debug message..." << std::endl;
logstream.close();
然而这显然是非常不正确的——你甚至不能像这样初始化一个普通的std::ostream。我应该如何处理 - 最好同时避免使用原始指针?
【问题讨论】:
-
您没有显示
FILE *logstream是如何关闭的(如果有的话)以及如何处理的。 -
失败原因:A) 无法复制流。想一想同一流的两个副本同时写入同一底层介质可能带来的乐趣。 B)Object Slicing。解决方法:没有。需要查看更多背景信息,看看我脑海中浮现的任何想法是否真的适用。
-
void openFile(const char *mode, char *filename, FILE *fileptr)不能很好地工作。我建议您改为返回FILE指针。 -
糟糕,这是一个双指针。你明白了。它将以
fclose(logsream)关闭 -
IOStreams因其糟糕的设计和可用性而臭名昭著。使用printf样式格式字符串或std::format,忘记IOStreams在现代代码中的格式,IMO。