在循环内写多行

时间:2013-07-01 15:16:50

标签: c++ visual-studio-2010 winapi

我宣布了

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。我之前问了一个问题。在发生此错误之前包含错误,并且还包含问题的解决方案。我问那里,但由于不活动,我再问。但问题不同。

2 个答案:

答案 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
);

lpNumberOfBytesWrittenlpOverlapped不能同时为NULL。 由于0 lpNumberOfBytesWritten lpOverlapped NULL0,因此它正在尝试写入地址位置... DWORD dummy = 0; WriteFile(myFile,body,BufferNo,&dummy,NULL); ... ,这会导致异常。

给它一个虚拟变量。

CreateFile(...)

您还应该将CloseHandle(...)和{{1}}移到循环块之外(无需重复打开和关闭文件)。