我宣布了
char body[1000] ;
HANDLE myFile;
我已经有一个上一节,我在其中创建一个文件并写下标题。它写得很好。
它有以下命令,没有循环。
HANDLE myFile=CreateFile("filename.txt",GENERIC_ALL,FILE_SHARE_WRITE,0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
char* HeadingStr="a1 a2 a3 a4 a5 a6 a7 a8 \n";
WriteFile(myFile,HeadingStr,lstrlen(HeadingStr),0,NULL);
CloseHandle(myFile);
然后我有以下代码
loop{ (100 times)
myFile=CreateFile("filename.txt",FILE_APPEND_DATA,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
BufferNo=sprintf(body,"%f %f %f %f %f %f %f %f \n",a1,a2,a3,a4,a5,a6,a7,a8);
WriteFile(myFile,body,BufferNo,0,NULL);
CloseHandle(myFile);
}
循环实际上是我从设备收到的消息。所以,这不需要做任何事情。
运行代码后,错误访问冲突错误并指向
WriteFile(myFile,body,BufferNo,0,NULL);
如果我检查文件,我会
a1 a2 a3 a4 a5 a6 a7 a8 (rectangle: may be way of text editor saying line break) and then 2 4 23 21 12 431 23 32 (same rectangle)
这就是全部。该错误指出这不是由于来自设备的消息。 如果您需要更多详细信息,请与我们联系。 错误在哪里?
P.S。我之前问了一个问题。在发生此错误之前包含错误,并且还包含问题的解决方案。我问那里,但由于不活动,我再问。但问题不同。
答案 0 :(得分:1)
我认为阅读函数WriteFile()的代码会很有趣。
无论如何,您尝试进行的计算类型的常用算法是:
打开文件
写行(如果需要,循环)
关闭文件
而不是
打开文件,写入,关闭
打开文件,写入,关闭
...
所以,我认为最好是编写一个预先打开文件的函数,并从WriteFile()中删除此操作。
答案 1 :(得分:1)
WriteFile原型:
BOOL WINAPI WriteFile(
_In_ HANDLE hFile,
_In_ LPCVOID lpBuffer,
_In_ DWORD nNumberOfBytesToWrite,
_Out_opt_ LPDWORD lpNumberOfBytesWritten,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
lpNumberOfBytesWritten
和lpOverlapped
不能同时为NULL
。
由于0
lpNumberOfBytesWritten
lpOverlapped
NULL
为0
,因此它正在尝试写入地址位置...
DWORD dummy = 0;
WriteFile(myFile,body,BufferNo,&dummy,NULL);
...
,这会导致异常。
给它一个虚拟变量。
CreateFile(...)
您还应该将CloseHandle(...)
和{{1}}移到循环块之外(无需重复打开和关闭文件)。