2011-11-28 10 views
-1

私はこのファイルをユーザから取得し、次にファイル名を取得し、ファイルの内容を優先キューに読み込みます。プログラムを実行すると、最初のファイル名を入力すると、セグメンテーション違反が発生します。複数のファイルから読み取るときにセグメンテーションフォルトが発生する

#include <cstdlib> 
#include <ctime> 
#include <functional> 
#include <iostream> 
#include <queue> 
#include <fstream> 
using namespace std; 

int main() { 
    char *filename; 
    int fnum; 

    cout<<"Number of files:"<<endl; 
    cin>>fnum; 

    int i; 
    priority_queue<int, vector<int>, greater<int> > pqi; 
    for(i = 0; i<fnum;i++){ 
     cout <<"Enter Filename:"<<endl; 
     cin>>filename; 
     ifstream inFile(filename); 
     long n; 
     while(!inFile.eof()){ 
      inFile >> n; 
      pqi.push(n); 
     } 
     inFile.close(); 
     inFile.clear(); 
    } 
    while(!pqi.empty()) { 
     cout << pqi.top() << ' '; 
     pqi.pop(); 
    } 
} 

理由を特定できません。あなたのコードで

+2

:あなたは自動的にメモリ管理を行い、使いやすいstringタイプを使用することができますか? –

+3

デバッガを試しましたか? –

+0

これが宿題であれば、それに明示的に '宿題 'を付ける必要があります。 – Hossein

答えて

3

問題はchar*の定義にあります。ポインタを定義するだけで、メモリを割り当てません。

char filename[256]; 
//No need to delete[] anything in this way. 

上記の方法のいずれもがに一定量のメモリを割り当てる:あなたはまた、静的配列を使用することができます。この単純なケースで

char *filename = new char[256]; 
//... rest of your code ... 
//When you no longer need filename (usually at the end of the code) 
//you have to free the memory used by it manually: 
delete[] filename; 

:あなたはnewキーワードを使用してそれにメモリを割り当てる必要がfilename。つまり、上記の例で256バイトを超えるファイル名を入力すると、バッファオーバーフローが発生します。私はポストを編集示唆し、コードのインデントを修正する可能性があり

#include <string> 
string filename; 
cin >> filename; 
+0

おそらくアンダーランではなくバッファオーバーフロー*を意味しています。 – DarkDust

+0

ありがとうございます。修正しました。 – Hossein

2

あなたは

char *filename; 

を持っているし、後であなたは、ファイル名に割り当てられた、単純にスペースを持っていないので、入力はいくつかの未定義のメモリに書き込まれ

cin>>filename; 

を使用しています。 filenameをcharの配列として定義するか、std::stringを使用します。

関連する問題