2016-06-29 6 views
-6

У меня есть код для вывода в файл из 2D-вектора Kvec. Имя файла вводится в строку s, и я использую sprintf для преобразования int в char, который должен быть введен в строку. Затем я использовал s.c_str(), чтобы ввести его в качестве имени файла, который я хочу открыть. Поэтому, когда я пытаюсь запустить код, я получаю segfault, когда пытаюсь открыть файл с помощью foo.open(). У меня есть такая небольшая область ошибок, что я сбиваюсь с толку, где может быть ошибка.Ошибка сегментации при открытии файла в C++

Я уже использовал эту технику для работы над строками для открытия файлов, поэтому знаю, что sprintf и s.push_back() работают. Где я иду не так?

fstream foo; 

    string s; 
    char g[10],j[10]; 
    int b=0; 

    sprintf(j,"L_%dLprime_%dM_%dMprime_%d",L,Lprime,M,Mprime); 
    for(int i=0;i<(int)strlen(j);i++) 
     s.push_back(j[i]); 

    for(int D = 0; D < 1000; D++) 
    { 
     s+="MSF-Dval"; 

     sprintf(g,"%d",D); 
     for(int i=0; i<(int)strlen(g); i++) 
      s.push_back(g[i]); 
     s+=".dat"; 

     foo.open(s.c_str(), ios::in | ios::out | ios::binary); 

     cout<<"Is this working?"<<endl; 

     b = 0; 

     for(L1=abs(L-D);L1<L1max;L1++) 
     { 
      if((D>abs(L+L1) || D<abs(L-L1)) && b == 0) 
      { 
       if(remove(s.c_str())!=0) 
        cout<<"error deleting file"; 
       break; 
      } 
      b = 1; 

      if(foo.is_open()) 
      { 
       foo << L1 << " "<<Kvec.at(L1).at(L1+D-abs(L-L1)).re<<" "<<Kvec.at(L1).at(L1+D-abs(L-L1)).im<<endl; 
      } 
      else 
       cout<<"not open"; 

     } 
     foo.close(); 

     s.erase(8,4 + (int)strlen(g)); 

    } 
+0

* Ошибка сегментации при смешивании C и C++ – LogicStuff

+2

Ваша первая строка 'sprintf' забивает черту более 10 символов в массиве' j' –

ответ

2

Ваша проблема в этих двух строках.

char g[10],j[10]; 
sprintf(j,"L_%dLprime_%dM_%dMprime_%d",L,Lprime,M,Mprime); 

Вы выделить буфер на 10 символов для j, а затем продолжить писать более 20 символов в этот буфер, наката, и применение Undefined Behavior.

Как только вы попадаете в UB, segfault - это лишь одна из многих вещей, которая пойдет не так.

+0

Ах, спасибо огромное! Интересно, почему это ошибка, когда я пытаюсь открыть файл, а не оператор sprintf. Это было бы намного легче отлаживать. – pyroscepter

+0

UB не обязательно вызывать мгновенный сбой или даже сбой вообще. Я бы заменил этот код 'c' на' C++ '. – drescherjm

Смежные вопросы