【问题标题】:Error Writing to File in Visual Studio在 Visual Studio 中写入文件时出错
【发布时间】:2013-06-28 14:04:51
【问题描述】:
Unhandled exception at 0x102e1cee (msvcr100d.dll) in filename.exe 0xC0000005: Access violation writing location 0x00416858 on.

调试指向行:

if (_putc_nolock(ch, f) == EOF)

代码

#else  /* _UNICODE */
    if (_putc_nolock(ch, f) == EOF)
#endif  /* _UNICODE */
        *pnumwritten = -1;
    else
        ++(*pnumwritten);
}

在 output.c 中,我认为它链接在 Visual Studio 库中。我没有链接它。

我的代码是:

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

我最初使用以下几行写入文件。我必须写标题。

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

如何解决此错误?注意我有写权限。我也以管理员身份运行。 请注意,我已经在上一个代码中的使用之外定义了 BufferNo、myFile。

更新 我删除了body="" 现在我明白了

filename.exe triggered a breakpoint.

指向下面评论中提到的文件。

**EDIT**

现在,我有写作问题。 错误读取

Unhandled exception at 0x7c811384 in stabilo.exe: 0xC0000005: Access violation writing location 0x00000000 on.

并指向直线

   WriteFile(myFile,body,lstrlen(body),0,NULL);

【问题讨论】:

  • body="" 看起来很奇怪。您需要一个缓冲区来存储字符串。
  • 需要更多信息。例如,body 是如何声明的?一般来说,你应该发一个SSCCE
  • 我删除了那个初始化。将主体定义为全局变量。现在,它说 filename.exe 触发了一个断点。并指向 { __debugbreak(); } 在文件 dbgrptt.c 中
  • 全局char *body 分配给它的存储空间为零。让它,就像我的回答说的那样,char body[1000];,你可以写 1000 个字符。这可能超出了您的价值观所需要的范围。使用 char *body 只会给你一个 NULL 指针,这是运行时库中断言的原因。
  • 为了将来参考,您的堆栈跟踪位于 msvcr100d.dll 中,这意味着您错误地调用了 C 标准库函数。所以不要看 WinAPI 函数,或者在你的问题标题中加上“WINAPI”。如果您知道这一点,这将是一个强烈的暗示,文件写入权限也不是问题。

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


【解决方案1】:

本节中的变量body 不正确。

body="";
...
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);

大概是char *(虽然我只是在猜测),这意味着您正在尝试将一堆数值写入能够恰好包含零字符的常量字符串。因为它是一个常数,所以它是不可写的。

将其更改为 char body[1000]; 或类似名称。

【讨论】:

  • 哈,错过了第一行。很好的收获。
  • 如果所有数字都接近 DBL_MAX,猜猜会发生什么。
  • 不,所有的数字都是双倍的。但是,调试器仍然指向 WriteFile。有什么意见吗?
  • 如果您的意思是调试器显示带有WriteFile 的行作为代码从sprintf 返回时将执行的行,那么这是正确的。但我 100% 确定我的答案描述了您的代码中的问题。我并不是说代码中不能有其他问题,包括导致 WriteFile 出错的问题。
  • 不,我非常感谢您的帮助。我还想知道您是否可以帮助解决这个新错误。这是新的错误。调试器指出这是错误。我已经更新了我的问题。
【解决方案2】:

您的sprintf 肯定会超出缓冲区。更糟糕的是:您尝试覆盖字符串文字。

【讨论】:

  • 感谢您的回复。我不明白你的意思。如果我删除了字符串声明 body="" 并定义为 char* body,并直接使用,它应该删除错误吗?
  • 如果是 char[10000],这个问题可能会消失,但在你至少学会最基本的东西之前,你只会把世界置于危险之中。
  • 是的,我仍在学习基础知识。自从我开始 C(实际上是 2 个)以来,还不到几个星期。我不得不加快速度,这就像复杂化。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
相关资源
最近更新 更多