2010-12-07 10 views
0

こんにちはタイトルはすべて本当に言います。私は材料の組成(ポリエンのような、または鉛の天然組成)に関するデータを保持するファイルを読み込む方法を持っています。これらの材料のそれぞれはの異なるオブジェクトで保持され、それぞれ異なる組成を持っています。 makeメソッドは、物理システムを構成するマテリアルが別のファイルから取得されると、次の自然なステップであるため、順番に呼び出されます。リストに書き込まれる内容はファイルへのo/pで、は実際にはとなり、そのファイルの最後にはopが付きます。流出を避けるには?例えばロングメソッドへの連続呼び出しにより、スリングが生成される

void material::make(char* filename) 
{   
    ifstream fin(filename) ;  
ofstream filenameOUT ; 
string outfile = (string)filename + "OUT.txt" ; 
filenameOUT.open(outfile.c_str()) ; 
    string ZStr, propStr, isotope ; 
    vector<float> component(2,0) ; 

    getline(fin, propStr, '\n') ; //store first entry in file as a str (prop is used to save mem allocation) 
    lamda = atof(propStr.c_str()) ; //then convert to float so calcs can be done 
filenameOUT<<"lamda: "<<lamda<<endl; 

    while(!fin.eof()) 
    { 
     getline(fin, isotope, ' ') ; //get the element name 
     getline(fin, ZStr, '\t') ; //get the Z's and abunancies from the file. 
     getline(fin, propStr) ; 
     component[0] = atof(ZStr.c_str()) ; 
     component[1] = atof(propStr.c_str()) ; 
filenameOUT<<"isotope: "<<isotope<<" isotope Z: "<<component[0]<<" proportional amount: "<<component[1]<<endl; 
     composition.push_back(component) ; 
     elements.push_back(isotope) ; 
    } 
filenameOUT<<filename<<" is loaded"<<endl; 

    for(c=composition.begin();c!=composition.end();c++) 
    { 
filenameOUT<<(*c)[0]<<" : "<<(*c)[1]<<" is loaded"<<endl; 
    } 
} 

、ポリエチレンの入力ファイル:

.335657 
carbon 12 .33333 
hydrogen 1 .66667 

は、(一度、鉛、銅、ホウ素、水素の同位体を含有する三回及び炭素)、これを生成する:

lamda: 0.335657 
isotope: carbon isotope Z: 12 proportional amount: 0.33333 
isotope: hydrogen isotope Z: 1 proportional amount: 0.66667 
poly.txt is loaded 
11 : 0.04 is loaded 
10 : 0.01 is loaded 
12 : 0.31778 is loaded 
1 : 0.63332 is loaded 
1 : 0.63332 is loaded 
204 : 0.014 is loaded 
206 : 0.241 is loaded 
207 : 0.221 is loaded 
208 : 0.524 is loaded 
208 : 0.524 is loaded 
106 : 0.0125 is loaded 
108 : 0.0089 is loaded 
110 : 0.1249 is loaded 
111 : 0.128 is loaded 
112 : 0.2413 is loaded 
113 : 0.1222 is loaded 
114 : 0.2873 is loaded 
116 : 0.0749 is loaded 
12 : 0.33333 is loaded 
1 : 0.66667 is loaded 

何かアドバイスをいただければ幸いです! (そして、はい、それは戻り値として 'void'と言います。次のメソッドを実行する前に、各メソッド呼び出しからの戻りを待つことができますが、私はそれを行う方法がわかりません)

私はできませんこの問題を解決するための方法を見つけたのは、用語が何であるかを本当に知っているわけではないからです。

+2

ご迷惑をおかけして申し訳ございません。 「流出」とはどういう意味ですか?たぶん、どのようなアウトプットが期待されているのかを示すことができます – atzz

+0

は短いで、O/Pは次のよ​​うになります ラムダ:0.335657 同位体:炭素同位体Z:12の比例量:0.33333 同位体:水素同位体Z:1の比例量:0.66667 poly.txtが 12にロードされます:0.31778がロードされました 1:0.63332がロードされました – morb

+0

私はこれが私が今知っておくべきことであると仮定しています。誰かが正しい方向で私に何かを読んだり、検索するためのキーワードをいくつか教えてくれましたか? – morb

答えて

0

どのように私の質問は理解できませんか? (技術的なプログラミング用語の知識が不足しているのを除いて、理解できるようにコードを書いた。)

上記のメソッドはmainメソッドから6回呼び出されます。

ファイルを入力するたびに(コードがどのように動作するかを示すために含まれている最短のものなど、ファイルから入力を受け取ります。

入力ファイルの最初の行はlamdaという変数に保持されていますが、outpufファイルに出力される以外は再使用されません。

inoutファイルの連続した線が読み込まれ、同位体の 'Z'およびその特定の 'Z'の相対存在量に対応する2つのエントリのベクトルに配置されます。このベクトルはリストに入れられます。ベクトルに保持されている値は、明らかに出力ファイルに書き込まれたものと考えられます。

ご覧のとおり、入力ファイルの行数よりも多くのエントリがリストにあります。

これらの無関係な行は、同じメソッドが実行されて別のオブジェクトで発生します。

私が参照している「流出」とは、別個のオブジェクトにあるリスト内のアイテムの別のものへの流出です。実行中のメソッドの数のために、多くの '流出'があります。

メモリアドレスの類似点がcのものと共有されているため、私はそれが本質的だと思っていたのと同じことを言いました。

私はこれを避ける方法をアドバイスする必要があります。同じ種類のオブジェクトを開き、(この場合のように)それらのメソッドを並列に実行する多くのプログラムが必要です。私はリストが物理的に必要なときに挙動するように、それぞれが必要とされるときにリストをメモリからクリアすることはできません。

+0

MADE LIST PRIVATE WORKS今、公然になったときと同じように行動しましたか? – morb

関連する問題