在C ++中读取文件抛出Seg Fault

时间:2010-04-27 19:25:49

标签: c++

当尝试从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) 

提前致谢。

3 个答案:

答案 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的原因。