当尝试从C ++中的文件读取令牌时,我收到了seg错误。只是为了玩一些东西,我尝试阅读文件,只是打印,令人惊讶的是,如果您取消注释第一个文件读取的代码,然后读取第二个文件一切正常。如果您对注释代码进行注释,则在关闭第一个文件时会收到seg错误。这可能是我学校机器上的库的一个问题...下面是段错误(在代码本身下面)。值得注意的是,我没有必要为我打开的每个文件执行“hack”,一旦执行了虚拟注释代码,所有后续流都打开就好了。
int main()
{
ifstream myfile1;
ifstream myfile2;
int m; //number of elements in 1st file
int n; //number of elements in 2nd file
int counter = 0;
int x = 0;
int y = 0;
int theta = 0;
Minutiae* minutiae;
minutiae = new Minutiae(x,y,theta,0);
Minutiae* file1_minutiaes;
Minutiae* file2_minutiaes;
int num;
//Some Error is caused with segfault if i Try to fill the minutiae array and then close the file unless i do this first
/*////////////////////
myfile1.open("2a");
if (myfile1.is_open())
{
counter = 0;
while (!myfile1.eof() )
{
myfile1 >> x >> y >> theta;
minutiae = new Minutiae(x,y,theta,counter);
counter++;
}
myfile1.close();
}
else
{
cout << "unable to open file1" << endl;
return(0);
}
*/////////////////////////////////////
myfile1.open("2a");
if (myfile1.is_open())
{
counter = 0;
myfile1 >> m;
file1_minutiaes = new Minutiae[m];
while (!myfile1.eof() )
{
myfile1 >> x >> y >> theta;
//minutiae = new Minutiae(x,y,theta,counter);
//file1_minutiaes[counter] = *minutiae;
file1_minutiaes[counter] = *(new Minutiae(x,y,theta,counter));
counter++;
}
myfile1.close();
cout << "closing file1" << endl;
}
else
{
cout << "unable to open file1" << endl;
return(0);
}
////////////////////////////////
}
堆栈跟踪:
Starting program: /cs/student/dick_man_chini/Desktop/a.out
Program received signal SIGSEGV, Segmentation fault.
0x00c47a72 in _int_free () from /lib/libc.so.6
(gdb) up
#1 0x006d9342 in operator delete(void*) () from /usr/lib/libstdc++.so.6
(gdb) up
#2 0x006d939e in operator delete[](void*) () from /usr/lib/libstdc++.so.6
(gdb) up
#3 0x00686130 in std::basic_filebuf<char, std::char_traits<char> >::_M_destroy_internal_buffer() () from /usr/lib/libstdc++.so.6
(gdb) up
#4 0x006874d1 in std::basic_filebuf<char, std::char_traits<char> >::close() () from /usr/lib/libstdc++.so.6
(gdb) up
#5 0x006894a6 in std::basic_ifstream<char, std::char_traits<char> >::close() () from /usr/lib/libstdc++.so.6
(gdb) up
#6 0x08048e96 in main ()
(gdb) up
Initial frame selected; you cannot go up.
(gdb)
提前致谢。
答案 0 :(得分:0)
用于读取文件的常用过程:
myfile1.open("2a");
// Note the change in the next line
if (!myfile1)
{
cout << "unable to open file1" << endl;
return(0);
}
counter = 0;
// Note, this line differs between the two examples.
myfile1 >> m;
file1_minutiaes = new Minutiae[m];
// Note the change in the following line
while (myfile1 >> x >> y >> theta)
{
//minutiae = new Minutiae(x,y,theta,counter);
//file1_minutiaes[counter] = *minutiae;
file1_minutiaes[counter] = *(new Minutiae(x,y,theta,counter));
counter++;
}
myfile1.close();
cout << "closing file1" << endl;
我建议您使用std::vector
而不是数组:
std::vector<Minutiae> file1_minutiaes;
处理数据文件时,最好使用动态容器。
答案 1 :(得分:0)
如果m
小于文件中的实际数据行数,您将踩踏随机内存,很可能导致损坏和您看到的崩溃。你的while循环也应该确保你没有超过m
次迭代。
在C ++领域,你可以使用std :: vector为你管理所有内存:读取每一行,在堆栈上创建一个Minutiae
,然后将其推送到向量上(交替使用new和store某种智能指针)。
答案 2 :(得分:0)
A)如上所述,你的第一次尝试实际上是泄漏,因为你只有一个指针,而不是一个实际的数组或一个指针数组,因为新的返回是一个Minutiae指针,而不是一个Minutiae。你的第二次尝试是返回一个Minutiae指针,然后取消引用它以获得Minutiae,然后使用赋值运算符将其复制到数组中创建的Minutiae。您可能希望阅读指针,以确保您了解其中的差异。
B)我要做的第一件事就是确保根据你的假设(整数后跟整数后跟整数*但很多行)正确格式化你的数据。之后,你应该使用eof()|| bad()而不仅仅是eof()。或者失败我认为使用它们。查看ifstream的引用,但是如果内存正确使用eof将无法保护您,以防读取文件遇到其他错误,这可能是您的SIGSEV的原因。