我正在尝试使用
ofstream
,在函数getlog()
中打开功能WriteLine()
。我有一个名为 LOG
: 的结构
struct LOG {
wchar_t logfile[PARM_MAX_SIZE];
std::ofstream* stream;
};
这是函数
WriteLine()
的参数。当我尝试使用这个流时,出现读取错误。
我正在尝试使用
LOG
变量的引用。我尝试将 ofstream* stream
转换为 ofstream&
但我不知道如何正确执行,因为 LOG
的初始化是:
static const LOG INITLOG {L"", NULL};
而且我不知道如何更改它以使用流上的引用。
功能:
LOG getlog(wchar_t logfile[]) {
ofstream logf(logfile, ios::app);
if (!logf.is_open()) {
throw ERROR_THROW(112)
}
LOG log{};
wcscpy_s(log.logfile, logfile);
log.stream = &logf;
return log;
}
void WriteLine(LOG log, char* c, ...) {
char str[80]{};
char** p = &c;
while (*p[0]) {
strcat_s(str, *p);
p++;
}
str[strlen(str)] = '\0';
ofstream* logf = log.stream;
*logf << "str";
}
主要功能
int _tmain(int argc, wchar_t* argv[]) {
setlocale(LC_ALL, "rus");
Log::LOG log = Log::INITLOG;
try {
Parm::PARM parms = Parm::getparm(argc, argv);
log = Log::getlog(parms.log);
Log::WriteLine(log, (char*)"Тест:", (char*)" без ошибок \n", "");
/*Log::WriteLine(log, (wchar_t*)L"Тест:", (wchar_t*)L" без ошибок \n", L"");
Log::WriteLog(log);*/
}
catch (Error::ERROR e) {
cout << "Ошибка " << e.id << ": " << e.message << ", строка " << e.inext.line << ", позиция " << e.inext.col << endl << endl;
}
system("pause");
return 0;
}
您的
getlog()
函数正在创建一个新流并返回它,但是是通过返回一个指向局部变量的指针来实现的,该局部变量在函数退出时超出范围。为了避免这种情况,您需要动态创建流,例如:
struct LOG {
std::wstring logfile;
std::unique_ptr<std::ofstream> stream;
};
LOG getlog(const wchar_t* logfile) {
auto logf = std::make_unique<std::ofstream>(logfile, std::ios::app);
if (!logf->is_open()) {
throw ERROR_THROW(112)
}
LOG log;
log.logfile = logfile;
log.stream = std::move(logf);
return log;
}
template<typename... Args>
void WriteLine(LOG& log, Args&&... args) {
(*(log.stream) << ... << args) << '\n';
}
int _tmain(int argc, wchar_t* argv[]) {
setlocale(LC_ALL, "rus");
try {
Parm::PARM parms = Parm::getparm(argc, argv);
Log::LOG log = Log::getlog(parms.log);
Log::WriteLine(log, "Тест:", " без ошибок ");
/*Log::WriteLine(log, L"Тест:", L" без ошибок ");
Log::WriteLog(log);*/
}
catch (Error::ERROR e) {
cout << "Ошибка " << e.id << ": " << e.message << ", строка " << e.inext.line << ", позиция " << e.inext.col << endl << endl;
}
std::system("pause");
return 0;
}