2

当我的程序出现分段错误时,我一直在尝试进行一些调试。我已经追踪到调用倒带的位置。

创建 ISBNPrefix 对象时打开文件

ISBNPrefix::ISBNPrefix(const char* filename) 
{

   file = fopen( filename, "r" );

}

文件是 ISBNPrefix 类的成员:

class ISBNPrefix {
FILE* file;
public:
    ISBNPrefix(const char* filename);
    bool isRegistered(int area) const;
    int minNoDigits(int area) const;
    bool isRegistered(int area, const char* publisher) const;
    ~ISBNPrefix();
};

创建 ISBNPrefix 对象的行是:

ISBNPrefix prefixList("prefixRanges.txt");

prefixRanges.txt 是我目录中的文件名

现在我在这个部分发生了分段错误:

//-------------------------------
cout << "MADE IT 1" << endl;
//-------------------------------
   rewind( file );
//-------------------------------
cout << "MADE IT 2" << endl;
//-------------------------------

哪个输出:

MADE IT 1
Segmentation fault

解构器:

ISBNPrefix::~ISBNPrefix()
{
   if( file != NULL )
   {
      fclose(file);
   }
}

是文件被关闭的唯一地方

编辑:经过一些故障排除后,没有找到解决方案,建议我发布所有内容。由于我的声誉很低,而且我不能发布超过 2 个链接,因此 pastebin 链接位于评论部分。

4

2 回答 2

4
if(file != NULL)
cout << "ITS NOT NULL";
   rewind( file );

本来应该

if(file != NULL)
{
    cout << "ITS NOT NULL";
    rewind( file );
}

在第一个版本中,只有 ourput 语句是有条件的,无论您如何缩进以下行......

我认为即使对于单个语句块也始终包含括号({})是一种好习惯,以避免像这样的简单事情。此外,正确格式化您的代码,并确保缩进遵循实际的代码结构。例如:

if(file != NULL)
    cout << "ITS NOT NULL";
rewind( file );  // it would have been more obvious this way
于 2013-03-16T20:20:24.393 回答
3

我没有看到你看到的问题,但我确实看到了一个严重的问题。在我的系统上,它会导致您的程序在退出时崩溃。也许在您的系统上,这是您的问题的原因。

ISBN 标头中的此代码

class ISBN{
        char area[5];
        char publisher[7];
        char title[6];
        bool registered;
        char ISBNstr[11];
        bool isRegistered(const ISBNPrefix& list);

和 ISBN 构造函数中的这段代码

ISBN::ISBN()
{
   for(int i=0;i<=5;i++)
   {
   area[i] = '\0';
   }

   for(int i=0;i<=7;i++)
   {
   publisher[i] = '\0';
   }

   for(int i=0;i<=6;i++)
   {
   title[i] = '\0';
   }

   for(int i=0;i<=11;i++)
   {
   ISBNstr[i] = '\0';
   }
   registered = false;
}

这些循环都绕了一圈太多次。i<5例如,它不应该i<=5在区域循环中

   for(int i=0;i<5;i++)
   {
   area[i] = '\0';
   }

由于这个错误,您正在破坏内存,这很容易导致您看到的问题。

于 2013-03-16T21:51:55.580 回答