2013-03-21 4 views
0

У меня есть C++ приложения, которые имеют следующий код:Не удается открыть файл в Loop 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(); 
      } 
      } 

В первой итерации цикла делает ожидаемый, но так как второй - file.is_open() возвращает ложный. Все файлы существуют. Не могли бы вы объяснить мне, пожалуйста, что не так ???

+5

ваш код не может скомпилировать: 'std :: ifstream file (;' недействителен синтаксис C++ –

+0

Не ваш вопрос, а зачем вам нужны 'tempCerts'?' List.push_back (data [j]); 'будет работать – john

+3

_Guess_: 'путь' нуждается в восстановлении, а не в непрерывном добавлении. – hmjd

ответ

9

Вы делаете path.append - что такое path? Что вы ожидаете от первой итерации - это нормально, что ALL_EPID_CERTS_1_0[1] прилагается к ALL_EPID_CERTS_1_0[0]?

+0

Почему это было опущено? Я думаю, что это проблема. – Xymostech

+1

Если это' std :: string', то на второй итерации это ' ll содержит конкатенацию 'ALL_EPID_CERTS_1_0 [0]' и 'ALL_EPID_CERTS_1_0 [1]', и я не думаю, что это то, что ожидается. – Paul

+0

@john добавляет в место http://www.cplusplus.com/reference/string/string/ append/ – kassak

0

Возможно, вам потребуется позвонить infile.clear();, чтобы очистить бит состояния после закрытия потока, иначе вы не сможете открыть новый файл с тем же потоком.

Также: Вы уверены, что вам нужно добавить путь к каждой итерации? Выведите переменную пути после каждого добавления вызова и проверьте правильность путей. Я ожидаю, что на второй итерации строка пути будет выглядеть примерно так: «c: /some/path/file1.txtfile2.txt»

В таких случаях я бы использовал stringstream или sprintf для генерации пути, и не изменяйте переменную пути.

Смежные вопросы