0

次のコードを持つc++アプリケーションがあります。

for (int i = 0; i < ALL_EPID_CERTS_LENGTH; i++)
            {
            std::ifstream file(; 
            file.open(path.append(ALL_EPID_CERTS_1_0[i]), std::ios::in | std::ios::binary); 
            if(file.is_open()) 
            {
                // get the length of the file 
                file.seekg(0, ios::end); 
                size_t fileSize = file.tellg(); 
                file.seekg(0, ios::beg);
                // create a vector to hold all the bytes in the file
                vector<byte> data(fileSize, 0);
                // read the file
                file.read(reinterpret_cast<char*>(&data[0]), fileSize);             
                byte *tempCerts = new byte[data.size()+1];
                memset(tempCerts,0,fileSize+1);
                std::copy(data.begin(), data.begin()+(data.size()), tempCerts);
                // !!!!check if NULL and place for NULL are needed
                for (int j = 0; j < data.size(); j++)
                {
                    list.push_back(tempCerts[j]);
                }
                file.close();
            }
            }

最初の反復ではループは期待どおりに実行されますが、2番目の反復以降-file.is_open()はfalseを返します。すべてのファイルが存在します。何が悪いのか説明してもらえますか?

4

2 に答える 2

9

あなたはpath.append何をしpathますか?最初の繰り返しの後はどうなると思いますか?ALL_EPID_CERTS_1_0[1]に追加しても問題ありALL_EPID_CERTS_1_0[0]ませんか?

于 2013-03-21T17:02:38.643 に答える
0

ストリームを閉じた後に状態ビットをクリアするために呼び出す必要がある場合がありinfile.clear();ます。そうしないと、同じストリームで新しいファイルを開くことができません。

また、繰り返しごとにパスに追加する必要がありますか? すべての追加呼び出しの後にパス変数を出力し、パスが正しいかどうかを確認します。2回目の繰り返しでは、パス文字列は次のようになると思います: "c:/some/path/file1.txtfile2.txt"

このような場合、 stringstreamorを使用sprintfしてパスを生成し、パス変数を変更しないようにします。

于 2013-03-21T17:15:35.117 に答える