Индексирование цикла while с параметром count в массиве - PullRequest
0 голосов
/ 05 марта 2010

Моя функция принимает массив объектов ifstream и количество объектов ifstream, как показано ниже:

void MergeAndDisplay(ifstream files[], size_t count)

Моя проблема в том, что я хочу использовать цикл while для чтения из файла (ов), пока один из них открыт. Когда я добираюсь до eof, я закрываю файл. Поэтому я подумал, что могу сделать что-то вроде

int fileNum = 0;
while(files[fileNum].is_open() || something here) {
//do stuff
}

Но я не совсем уверен, как правильно указать количество параметров в цикле while ...

Ответы [ 3 ]

2 голосов
/ 05 марта 2010

Вам придется вычислять логику «открыт ли любой файл в этом наборе» отдельно. Я предлагаю сделать это своей собственной функцией, чтобы цикл while мог быть чистым и естественным, например,

bool isAnyOpen(ifstream files[], size_t count) {
  for (size_t i = 0; i < count; ++i) {
    if (files[i].is_open()) return true;
  }
  return false;
}

Тогда вы можете написать

while(isAnyOpen(files, count)) {
  // Your code here
}

Редактировать: Это более общее решение, чем то, что опубликовал Р. Самуэль Клатчко. Если ваша проблема так же проста, как желание просто прочитать все данные из всех файлов, то используйте его метод, поскольку он более прямой.

0 голосов
/ 05 марта 2010

Попробуйте что-то вроде этого:

void ProcessStream(std::istream& input_file)
{
//...
}

// Your loop
bool  a_file_is_open = true;
do
{
  a_file_is_open = false;
  for (unsigned int i = 0; i < MAX_FILES; ++i)
  {
    if (files[i].is_open())
    {
      a_file_is_open = true;
      ProcessStream(files[i]);
      break;
    }
  }
} while (a_file_is_open);
0 голосов
/ 05 марта 2010

Вы, вероятно, хотите

while (fileNum < count && files[fileNum].is_open())

с условием, что вы увеличиваете fileNum всякий раз, когда открываете новый файл в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...