C++ 在Visual Studio中写入文件时出错
调试指向以下行:C++ 在Visual Studio中写入文件时出错,c++,c,visual-studio-2010,winapi,file-io,C++,C,Visual Studio 2010,Winapi,File Io,调试指向以下行: Unhandled exception at 0x102e1cee (msvcr100d.dll) in filename.exe 0xC0000005: Access violation writing location 0x00416858 on. 密码 if (_putc_nolock(ch, f) == EOF) 在output.c中,我相信它是在VisualStudio库中链接的。我没有把它联系起来 我的代码是: #else /* _UNICODE */
Unhandled exception at 0x102e1cee (msvcr100d.dll) in filename.exe 0xC0000005: Access violation writing location 0x00416858 on.
密码
if (_putc_nolock(ch, f) == EOF)
在output.c中,我相信它是在VisualStudio库中链接的。我没有把它联系起来
我的代码是:
#else /* _UNICODE */
if (_putc_nolock(ch, f) == EOF)
#endif /* _UNICODE */
*pnumwritten = -1;
else
++(*pnumwritten);
}
我最初写了以下几行代码到文件中。我得写标题
body=""
myFile=CreateFile("Sample.txt",FILE_APPEND_DATA,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
BufferNo=sprintf(body,"%.5f %[3].5f %[3].5f %[3].5f %[3].5f %[3].5f %[3].5f %[3].5f \n",a1,a2,a3,a4,a5,a6,a7,a8);
WriteFile(myFile,body,lstrlen(body),0,NULL);
CloseHandle(myFile);
如何解决此错误?注:我有书面许可。我也是以管理员的身份参加竞选的。
注意,我已经在上一个代码中的用法之外定义了BufferNo,myFile
更新
我删除了body=“
现在我明白了
HANDLE myFile=CreateFile("Sample.txt",GENERIC_WRITE,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);
指向下面评论中提到的文件
filename.exe triggered a breakpoint.
现在,我写作有问题。
错误读取
**EDIT**
并指向直线
Unhandled exception at 0x7c811384 in stabilo.exe: 0xC0000005: Access violation writing location 0x00000000 on.
本节中的变量
body
不正确
WriteFile(myFile,body,lstrlen(body),0,NULL);
大概是一个char*
(虽然我只是猜测),这意味着您正试图将一组数值写入一个能够容纳零个字符的常量字符串。因为它是一个常量,所以不可写
将其更改为
char body[1000]代码>或类似的东西 本节中的变量body
不正确
WriteFile(myFile,body,lstrlen(body),0,NULL);
大概是一个char*
(虽然我只是猜测),这意味着您正试图将一组数值写入一个能够容纳零个字符的常量字符串。因为它是一个常量,所以不可写
将其更改为char body[1000]代码>或类似的东西 您的sprintf
肯定会超出缓冲区。更糟糕的是:您试图重写字符串文字。您的sprintf
肯定会溢出缓冲区。更糟糕的是:你试图写一个字符串文字。body=”“
看起来很奇怪。您需要一个缓冲区来存储字符串。需要更多信息。例如,body
是如何声明的?一般来说,你应该发布一个。我删除了那个初始化。将主体定义为全局变量。现在,它说filename.exe触发了一个断点。并指向文件dbgrptt.cA globalchar*body
中的{uuuu debugbreak();}将为其分配零存储空间。就像我的回答所说的,charbody[1000]代码>,您可以向其中写入1000个字符。这可能比你的价值观需要的更多。使用char*body
只会给您一个空指针,这是运行库中出现断言的原因。为了便于将来参考,您的堆栈跟踪位于msvcr100d.dll内,这意味着您错误地调用了C标准库函数。所以不要看WinAPI函数,也不要把“WinAPI”放在问题的标题中。如果您早知道这一点,这将是一个强有力的提示,文件写入权限也不是问题。body=“”
看起来很奇怪。您需要一个缓冲区来存储字符串。需要更多信息。例如,body
是如何声明的?一般来说,你应该发布一个。我删除了那个初始化。将主体定义为全局变量。现在,它说filename.exe触发了一个断点。并指向文件dbgrptt.cA globalchar*body
中的{uuuu debugbreak();}将为其分配零存储空间。就像我的回答所说的,charbody[1000]代码>,您可以向其中写入1000个字符。这可能比你的价值观需要的更多。使用char*body
只会给您一个空指针,这是运行库中出现断言的原因。为了便于将来参考,您的堆栈跟踪位于msvcr100d.dll内,这意味着您错误地调用了C标准库函数。所以不要看WinAPI函数,也不要把“WinAPI”放在问题的标题中。如果你知道这一点,这将是一个强烈的暗示,文件写入权限也不是问题。哈,错过了第一行。接得好。如果所有数字都接近DBL_MAX,猜猜会发生什么。不,所有数字都是双倍的。但是,调试器仍然指向WriteFile。有什么意见吗?如果您的意思是调试器显示带有WriteFile
的行作为代码从sprintf
返回时执行的行,那么这是正确的。但我100%确信我的答案描述了代码中的一个问题。我不是说代码中不能有其他问题,包括导致WriteFile出错的问题。不,我真的非常感谢您的帮助。我还想知道你是否能帮我解决这个新错误。这是新的错误。调试器将此作为错误指向。我更新了我的问题。哈,错过了第一行。接得好。如果所有数字都接近DBL_MAX,猜猜会发生什么。不,所有数字都是双倍的。但是,调试器仍然指向WriteFile。有什么意见吗?如果您的意思是调试器显示带有WriteFile
的行作为代码从sprintf
返回时执行的行,那么这是正确的。但我100%确信我的答案描述了代码中的一个问题。我不是说代码中不能有其他问题,包括导致WriteFile出错的问题。不,我真的非常感谢您的帮助。我还想知道你是否能帮我解决这个新错误。这是新的错误。调试器将此作为错误指向。我已经更新了我的问题。谢谢你的回复。我不明白你的意思。如果我删除了字符串声明body=“”并定义为char*body,并直接使用,它是否应该删除错误?如果它是char[10000],这个问题可能会消失,但在你至少学会最基本的东西之前,你只会让世界处于危险之中。是的,我仍然在学习基础知识。从我开始C(实际上是2)到现在还不到几个星期。我必须加快速度,这就像是复杂的情况一样谢谢你的回复。我不明白你的意思。如果我删除了字符串声明body=”“并定义为char*body,并直接使用,它是否应该删除错误?如果是char[10000],这个问题可能会消失,但在你至少了解了最基本的东西之前,你只会让世界处于危险之中。是的,st