kru*_*son 2 c++ unhandled-exception
尝试编写.ply解析器以在OpenGL中使用.ply模型.
试图开始阅读.ply文件并写出它的所有行.我的程序执行此操作但是当它打印出最后一行时,我得到Unhandled exception:
PLY parser.exe中0x62aad540(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00000000.
这是我的代码:
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;
int main ()
{
char buffer[10000];
FILE * myFile;
myFile = fopen("walkman.ply", "r");
if(myFile != NULL)
{
while (!feof(myFile))
{
cout<<fgets(buffer, 10000, myFile);
}
fclose(myFile);
}
else
{
cout<<"file not found"<<endl;
}
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这可能是我的代码中的愚蠢错误,但如果有人能够发现导致此错误的错误,那将会很棒.
在我们了解bug之前,你应该知道你得到的"Unhandled exception ... Access violation reading 0x00000000"消息不是由C++异常引起的; 它是Windows的"Segmentation fault"等价物.您的代码尝试取消引用NULL指针.
现在,您已经犯了一个使用FILE对象的经典错误. feof(fp)到达文件末尾时不会变为真.它只是你以后变成真正尝试读取过去的文件的末尾至少一次.因此,你读的循环将迭代,直到后 fgets试图读到文件的结尾.当fgets尝试读取超过文件末尾时,它会失败,并返回一个NULL指针,您将盲目地传递给它cout.KABOOM.
(顺便说一下,这也是istream::eof()有效的.)
编写此循环的正确方法是
while (fgets(buffer, 10000, myFile))
cout << buffer;
Run Code Online (Sandbox Code Playgroud)
(或者,甚至更好,其中之一:
while (fgets(buffer, 10000, myFile))
fputs(buffer, stdout));
while(myFile.get(buffer, 10000))
cout << buffer;
Run Code Online (Sandbox Code Playgroud)
你正在做混合stdio.hFILE和iostreams 有点奇怪.)
| 归档时间: |
|
| 查看次数: |
3043 次 |
| 最近记录: |