C++读取文件时的未处理异常

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)

这可能是我的代码中的愚蠢错误,但如果有人能够发现导致此错误的错误,那将会很棒.

zwo*_*wol 6

在我们了解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 有点奇怪.)