我正在写入一个文件,使用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;
}
}
}
}