2017-04-30 3 views
-2

を取り除く方法:例えば、私は、ファイル名の一部の配列を持っている場合、elifの - else節

char arr[N] = ["FILENAME0", "FILENAME1", "FILENAME2", "FILENAME3", "FILENAME4", ...] 
私は N意志 fopenfclose Nファイルに依存する関数を書くことができますどのように


switch-caseif-elif-elseは簡単ですが、多くの条件が必要であり、Nを既に知っている必要があります(Nは実行時にstdinから渡されます)。

For-loopは、段階的に開閉するため、ここでは適切ではありません。私は冒頭に、機能はfopenNファイル、これらのすべてのこれらのすべてのNファイルディスクリプタは、メモリ内で利用可能でなければならないし、Nファイルを閉じる必要があります。

int func() 
{ 
    FILE *fp = fopen(arr[0]); 
    fclose(fp); 
    return 0; 
} 

またはN == 3場合:

int func() 
{ 
    FILE *fp = fopen(arr[0]); 
    FILE *fp1 = fopen(arr[1]); 
    FILE *fp2 = fopen(arr[2]); 
    fclose(fp); 
    fclose(fp1); 
    fclose(fp2); 
    return 0; 
} 
+0

二つのループ、最初で開かれたものを閉じるには、ランダムに他のオープンする1。 –

+0

[C:同時に2つの機能を実行できますか?](http://stackoverflow.com/questions/3051009/c-run-two-functions-at-the-same-time) –

+0

@narusin quistion isマルチスレッドに関することではありません –

答えて

1

だけstd::vectorにあなたのFILE* Sを保存し、第二のループでそれらを閉じる:あなたがファイルを開いたときの間に例外をスローする可能性が何かをした場合、あなたがそれらを閉じたときにあなたがかもしれその後、

void func(const std::vector<std::string>>& filenames) { 
    std::vector<FILE*> fds; 
    for (const std::string& filename : filenames) { 
     fds.push_back(std::fopen(filename.c_str(), "w")); 
    } 
    // Work with the file descriptors however you want 
    for (FILE* fd : fds) { 
     std::fclose(fd); 
    } 
} 

むしろ手動FILE* Sを閉じるよりも、例外セーフなラッパーを使用したい:

void func(const std::vector<std::string>>& filenames) { 
    std::vector<std::unique_ptr<FILE, int(*)(FILE*)>> fds; 
    for (const std::string& filename : filenames) { 
     fds.emplace_back(std::fopen(filename.c_str(), "w"), std::fclose); 
    } 
    // Work with the file descriptors however you want. To get 
    // the raw FILE* use fds[i].get() 

    // std::unique_ptr will call its deleter (std::fclose in this case) 
    // on its managed pointer in its destructor, so there's no need to 
    // manually close them 
} 
+0

私の投票を得ました。たぶんスタイルの問題ですが、私は常に 'std :: vector 'を引数リスト/戻り値の型として罪と同じように醜いものとして含む宣言を見つけます。まず、typedef std :: vector vecInt;とそれに付随するイテレータのtypedef vecInt :: iterator vecIntIter; – enhzflep

+0

をまず型定義してください。私は可能な限りtypedefを避けます。'std :: vector 'は 'StringVec'よりはるかに表現力があります。 typedefが使用されている場所のすぐ隣にある場合を除き、 'StringVec'が' std :: vector '、' std :: vector '、' std :: vector '、またはwhatであるかどうかはわかりません。 –

+0

本当、そうではありませんが、タイプをホバリングするとIDEが表示されます。考慮すべき異なる視点に感謝します。 :) – enhzflep

0

私の知る限り、そうであっFILE *fp = fopen(arr[0]);短縮の可能な解決策ではないとC++に、

は、私のようなN == 1機能が動作しますならばと期待します。 if-elif-else句を使用すると、ファイルを開いて閉じることができません。

+0

>これらのすべての 'N'ファイル記述子はメモリ内で利用可能でなければなりません 私は質問に追加しました。 –

+0

@RomaKarageorgievichあなたはあなたが言いたいことを広げるのに気を使いますか?私は、ファイル記述子がメモリ上で利用可能であるべきであるということを少し混乱させています。 –

+0

私は質問を更新しました –

関連する問題