Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Несколько init-expression в for

#cpp #циклы


#include 
#include 
#include 
#include 

using namespace std;

int Search(string* Array, int Size, string* Words) {
    ifstream *Read = new ifstream[Size];

    for (int I = 0; I < Size; I++) {
        Read[I].open(Array[I]);
        if (!Read[I]) {
            cout << "Файл с именем: " << Array[I] << "не может быть открыт \n";
        }
        // В следующей строке в возникает ошибка I должно иметь константное значение
        //Ошибки нет, если "string Value" вынести из цикла
        //Почему возникает ошибка ?
        for (string Value, Read[I] >> Value; !Read[I].eof(); Read[I] >> Value) {
            // Что-то делающий код
        }

    }

    for (int I = 0; I < Size; I++) {
        Read[I].close();
    }
}

    


Ответы

Ответ 1



В синтаксисе for     for ( init-statement conditionopt ; expressionopt ) statement первая часть - init-statement - является либо выражением, либо объявлением. Вы изначально использовали синтаксис string Value, [...], который явно говорит, что в вашем случае в качестве init-statement вы хотите использовать именно объявление, а не выражение. Однако дальнейший синтаксис [...], Read[I] >> Value не является корректным синтаксисом объявления. Отсюда и ошибка. (Странно, что вы в своем вопросе называете эту часть синтаксиса for "init-expression", хотя в вашем же примере это никакой не expression.) Выбирайте: либо выражение, либо объявление. Перемешать выражение с объявлением вот так вот в лоб, как у вас, не получится.

Ответ 2



for (string Value, Read[I] >> Value; !Read[I].eof(); Read[I] >> Value) { Да, так нельзя, потому что Read[I] >> Value - это не объявление переменной. Можно так: for (string Value; Read[I] >> Value, !Read[I].eof(); ) { В коде баг и нужно так: for (string Value; Read[I] >> Value; ) {

Комментариев нет:

Отправить комментарий