倒带导致分段错误

时间:2013-03-16 20:07:01

标签: c++

当我的程序出现分段错误时,我一直在尝试进行一些调试。我把它追踪到了倒带的地方。

创建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链接位于评论部分。

2 个答案:

答案 0 :(得分:4)

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

应该是

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

在第一个版本中,只有theput语句是有条件的,无论你多少缩进以下行......

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

if(file != NULL)
    cout << "ITS NOT NULL";
rewind( file );  // it would have been more obvious this way

答案 1 :(得分: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';
   }

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