2017-05-15 21 views
0

私はNTLライブラリ(これはC++ライブラリ)でアルゴリズムを書いています。今は編集するN個のファイルがあり、それらを同時に作成/開く必要があります。私は動的にN個のファイルポインタのスペースを割り当てようとしますが、コードに何か問題があります。コードスニペットを以下に示します。C++のfstreamの配列

P1 = (char **)calloc(n+1, sizeof(char *));//P1 is used to save file names 
for(i=1; i<=n; i++) 
{ 
    P1[i]=(char *)calloc(20, sizeof(char)); 
    sprintf(P1[i],"P1_%d.txt",i); 
} 
ifstream *fin = (ifstream *)calloc(n+1, sizeof(ifstream)); 
for(i=1; i<=n; i++) 
{ 
    fin[i].open(P[i]); 
} 

プログラムは、Linuxで実行すると、セグメンテーションフォールトがある私に語りました。私は

ifstream fin[200] 

代わりにプログラムが実行さ

ifstream *fin = (ifstream *)calloc(n+1, sizeof(ifstream)); 

の使用しようとすると、N以来

は、200より大きくありません。

私はC言語ではなくC++であることを知りました。実際にはfstreamクラスの仕組みはわかりません。同時にN個のファイルを開くよりよい方法があるかどうか教えてください。

+1

'C'には' ifstream'、AFAIRはありません。 –

+1

malloc/calloc関数はCでは使用されますがC++では使用されませんが、代わりにnewを使用する – ShellCode

+0

CおよびC++の配列は1ではなく0から開始するため、ループは 'for(i = 0; i

答えて

4

callocはメモリを割り当てますが、ifstreamは複雑なタイプです。オブジェクトの作成時に呼び出されるコンストラクタがあります。私はあなたがC + +についてのいくつかのドキュメント/本を読むべきだと思います。 new expressionを使用してC++でメモリを割り当てる必要があります。 Btw、現代のC++コンパイラを使用する場合は、スマートポインタ(unique_ptrなど)を使用する方がよいでしょう。また、オブジェクトのコンパイル時の未知数を保存する場合は、vectorを使用する方がはるかに優れています。この場合、vector<ifstream>を使用する方が簡単です。

// includes for vector and unique_ptr. 
#include <vector> 
#include <memory> 

vector<ifstream> streams; 
for (int i = 0; i < n; ++i) 
{ 
    streams.push_back(ifstream(P[i])); 
} 
+0

Uさん、ありがとうございました^^ –

+0

ベクトルを使う方が良いですか? –