当我的程序出现分段错误时,我一直在尝试进行一些调试。我把它追踪到了倒带的地方。
创建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链接位于评论部分。
答案 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';
}
由于这个错误,你正在破坏内存,这很容易导致你看到的问题。