0

我正在写入一个文件,使用ofstream. 一方面,写入非常迅速,文件关闭和打开非常频繁。下面是代码:

if( !(IS_ERROR(wcstombs_s( (size_t*)&out, fileRegNot, 1536, finalizedMessage, 1536 ))) )
{
    while(reportTransferInProgress);

    regFileBeingWritten = TRUE;

    if(fileRegReportSent)
    {
        file.open("C:\\fileRegLog.txt", ios::out);
        fileRegReportSent = FALSE;
    }
    else
        file.open("C:\\fileRegLog.txt", ios::out | ios::app);

    if(file.is_open() && file.good() && !file.fail() && !file.bad())
    {
        file<<fileRegNot<<"\n";
        file.close();
    }

    regFileBeingWritten = FALSE;
}

访问冲突发生在语句中file.close()。程序中断,编译器跳转到标准 fstream file中的以下代码(突出显示的行是中断的地方):

在此处输入图像描述

这是调用堆栈(startRecievingNotifications 是我在其中写入文件的函数的名称):

在此处输入图像描述

fstream现在这些是文件代码段中局部变量的状态:

在此处输入图像描述

这里 _Myfile 变量似乎没有指向任何有效的内存位置,可能是问题吧?但是,当您回到最初从我的代码中调用函数的位置时,即我在开头粘贴的“file.close()”,这些是局部变量的状态:

在此处输入图像描述

这里 _Myfile 变量显然有一个有效的内存位置和数据。我究竟做错了什么?在编写和关闭文件之前,我已经使用了我可能想到的所有检查:

if(file.is_open() && file.good() && !file.fail() && !file.bad())
{
    file<<fileRegNot<<"\n";
    file.close();
}

此外,错误不会经常发生。有时它不会在文件被连续写入时几分钟内发生,有时它会在应用程序执行后立即弹出。

这是原始的错误声明:

在此处输入图像描述

我在这里到底做错了什么?

编辑:(完整的功能代码)

DWORD WINAPI 
startRecievingNotifications(
    _In_ LPVOID lpArg)
{
    HANDLE hComPort = *((HANDLE*)lpArg);
    HRESULT hr;
    SIMPLE_MESSAGE MessageEnvelop;
    TCHAR processName[MAX_PATH];
    WCHAR finalizedMessage[1536];
    WCHAR pId[7];
    INT pid, out;
    ofstream file;

    for(;;)
    {
        hr = FilterGetMessage(hComPort, &MessageEnvelop.MessageHeader, sizeof(SIMPLE_MESSAGE), NULL);

        if(!IS_ERROR(hr) && checkMessage(MessageEnvelop.Message.Contents))
        {
            for(INT i = 0, j = 0; MessageEnvelop.Message.Contents[i] != '\0' && i < 1535; i++, j++)
            {
                if(i == 0)
                {
                    for(; MessageEnvelop.Message.Contents[i] != '#' && i < 6; i++)
                        pId[i] = MessageEnvelop.Message.Contents[i];

                    pId[i] = '\0';

                    pid = _wtoi(pId);

                    if(getProcessName(pid, processName, TRUE))
                    {
                        for(j = 0; processName[j] != '\0'; j++)
                            finalizedMessage[j] = processName[j];
                    }
                    else
                        i = 0;
                }

                finalizedMessage[j] = MessageEnvelop.Message.Contents[i];

                if(MessageEnvelop.Message.Contents[i + 1] == '\0')
                    finalizedMessage[j + 1] = '\0';
                }

            finalizedMessage[1535] = '\0';

            appendSystemTime(finalizedMessage);

            if( !(IS_ERROR(wcstombs_s( (size_t*)&out, fileRegNot, 1536, finalizedMessage, 1536 ))) )
            {
                while(reportTransferInProgress);

                regFileBeingWritten = TRUE;

                if(fileRegReportSent)
                {
                    file.open("C:\\fileRegLog.txt", ios::out);
                    fileRegReportSent = FALSE;
                }
                else
                    file.open("C:\\fileRegLog.txt", ios::out | ios::app);

                if(file.is_open() && file.good() && !file.fail() && !file.bad())
                {
                    file<<fileRegNot<<"\n";
                    file.close();
                }

                regFileBeingWritten = FALSE;
            }
        }
    }
}
4

0 回答 0