使用ofstream / fstream访问冲突错误?

时间:2013-05-09 16:51:47

标签: c++ fstream access-violation file-handling ofstream

我正在使用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中的以下代码(突出显示的行是它中断的地方):

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

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

此外,错误不会经常发生。有时在连续写入文件时不会发生多分钟,有时只要应用程序执行就会弹出。

这是原始错误陈述:

enter image description here

我到底错在了什么?

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

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;
            }
        }
    }
}

0 个答案:

没有答案