【发布时间】:2011-11-23 11:58:05
【问题描述】:
void graph::fillTable()
{
ifstream fin;
char X;
int slot=0;
fin.open("data.txt");
while(fin.good()){
fin>>Gtable[slot].Name;
fin>>Gtable[slot].Out;
cout<<Gtable[slot].Name<<endl;
for(int i=0; i<=Gtable[slot].Out-1;i++)
{
**//cant get here**
fin>>X;
cout<<X<<endl;
Gtable[slot].AdjacentOnes.addFront(X);
}
slot++;
}
fin.close();
}
这是我的代码,基本上它完全符合我的要求,但当文件不再正常时它会继续读取。它将输入和输出我要查找的所有内容,然后当文件结束时, fin.good() 显然不会返回 false。这是文本文件。
A 2 B F
B 2 C G
C 1 H
H 2 G I
I 3 A G E
F 2 I E
这是输出
A
B
F
B
C
G
C
H
H
G
I
I
A
G
E
F
I
E
Segmentation fault
-
这是 Gtable 的类型。
struct Gvertex:public slist
{
char Name;
int VisitNum;
int Out;
slist AdjacentOnes;
//linked list from slist
};
我希望它在输出文件中的最后一个字符“E”后停止。读取最后一个字符后,程序再也不会进入 for 循环。我不知道为什么 while 没有中断。
【问题讨论】:
-
我也试过用 eof() 没用。
-
为什么你认为它在阅读时会出现段错误?什么是 Gtable?您访问不存在的索引的可能性更大吗?调试器告诉你导致段错误的确切位置和指令是什么?
-
它可能会因其他原因出现段错误,但无论如何我都不想在文件完成后执行任何操作。我很确定它在尝试读取文件的空白部分时会出现段错误。 Gtable 是一个对象数组。这个数组被初始化为 100 个槽,只是为了确保我不会超出索引!
-
@TylerPaff:嗯,你知道任何类型的
eof()或good()只会在读取失败后 被设置,并且你通常应该检查是否读取成功,之后通过eof()询问原因? -
您确实知道标准 C++ 库提供自动调整容器大小的功能,是吗?你为什么要处理笨拙且容易出错的数组?另外,我们能看到 Gtable 是一个数组的定义吗?