倒带导致分段故障

rewind causes segmentation fault

本文关键字:故障 分段 倒带      更新时间:2023-10-16

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

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

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

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

此代码在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] = '';
   }
   for(int i=0;i<=7;i++)
   {
   publisher[i] = '';
   }
   for(int i=0;i<=6;i++)
   {
   title[i] = '';
   }
   for(int i=0;i<=11;i++)
   {
   ISBNstr[i] = '';
   }
   registered = false;
}

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

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

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