我正在使用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;
}
}
}
}