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の次のコードにジャンプします(強調表示された行は中断した場所です)。

ここに画像の説明を入力

これはコール スタックです (startRecifyingNotifications は、ファイルが書き込まれている関数の名前です)。

ここに画像の説明を入力

これらは、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