如何使用ofstream作为struct - 函数arg的一部分

问题描述 投票:0回答:1

我正在尝试使用

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;
}
c++ pointers struct reference stream
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.