【问题标题】:Writing Multiple Lines within Loop在循环中写入多行
【发布时间】:2013-07-01 15:16:49
【问题描述】:

我已经声明了

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

}

循环实际上是我从设备接收到的消息。所以,这不必对此做任何事情。

运行代码后,错误Access Violation Error并指向

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)

这就是全部。该错误指出这不是由于来自设备的消息。 如果您需要更多详细信息,请告诉我。 错误在哪里?

附:在此之前我问了一个问题。在此错误发生之前包含错误,并且还包含该问题的解决方案。我在那里问过,但由于不活跃,我又问了一次。但问题是不同的。

【问题讨论】:

  • 请发布您的所有代码 [至少足以成为可以编译的完整部分],因为到目前为止您发布的实际行实际上并没有显示任何错误。跨度>
  • 这个问题过于本地化,不太可能帮助未来的访问者。

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


【解决方案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 传递给lpNumberOfBytesWrittenlpOverlappedNULL,因此它正在尝试写入地址位置0,这会导致异常。

给它一个虚拟变量。

...
DWORD dummy = 0;
WriteFile(myFile,body,BufferNo,&dummy,NULL);
...

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

【讨论】:

  • 谢谢。希望它有效。我最初是这样开始的(打开/关闭)外部循环。甚至没有让写单行。
  • 其实直接用0和定义为参考后用0有什么区别。这两个?
  • 参数接受一个指向值的指针,而不是值本身。早些时候,您将 0 作为指针传递; 0 是无效的内存地址。在我的示例中,您在堆栈上创建一个 DWORD 值并将其 地址 传递给 WriteFile(因此是 &)。 WriteFile 将用自己的值(函数写入的字节数)覆盖dummy 的值。值 0 等价于空指针。
【解决方案2】:

我认为阅读您的函数 WriteFile() 的代码可能会很有趣。

无论如何,您尝试进行的计算的常用算法是:

  • 打开文件

  • 写行(如果需要循环)

  • 关闭文件

而不是

  • 打开文件、写入、关闭

  • 打开文件、写入、关闭

  • ...

所以,我想最好的办法是编写一个前置函数来打开你的文件,然后从 WriteFile() 中删除这个动作。

【讨论】:

  • WriteFile 是 Win32 API 的一部分。它在 MSDN 上有很好的记录。
猜你喜欢
  • 2011-10-25
  • 2021-07-06
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2016-09-30
相关资源
最近更新 更多