Простая проблема ввода-вывода в C ++ - PullRequest
0 голосов
/ 22 июня 2011

Прошло много времени с тех пор, как я работал с File I / O в C ++ (и только C ++ в целом), но недавно я решил использовать его для создания небольшого консольного проекта для друга.Моя проблема в том, что у меня есть некоторые проблемы с массивом строк и файловым вводом / выводом (я не уверен, что является причиной проблемы).Мой код выглядит следующим образом (ReadPSWDS является ifstream):

                int i = 0;
            string str[200];

            ReadPSWDS.clear();
            ReadPSWDS.open("myPasswords.DoNotOpen");

            if(ReadPSWDS.is_open())
            {
                while(!ReadPSWDS.eof())
                {
                    getline(ReadPSWDS, str[i]); //Store the line
                    if(str[i].length()<1 || str[i] == "")
                    {
                        //Ignore the line if it's nothing
                    }
                    else
                    {
                        i++; //Move onto the next 'cell' in the array
                    }
                }
            }

            ReadPSWDS.close();

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

С уважением,

Джо

1 Ответ

6 голосов
/ 22 июня 2011

Цикл, который вы написали, явно неверен: вы тестируете eof() до сбоя и не тестируете на сбой после getline.C ++ ввод / вывод не является прогнозирующим.(Не могу, потому что то, что вы находитесь на eof(), будет зависеть от того, что вы пытаетесь прочитать.) Правильный шаблон будет таким:

while ( i < size(str) && getline( readSWDS, str[i] ) ) {
    if ( !str[i].empty() ) {
        ++ i;
    }

Обратите внимание, что я добавил тест дляi.Как написано, если ваш файл содержит более 200 строк, у вас большие проблемы.

Однако я не уверен, что это ваша проблема;цикл, который вы написали, обычно вызывает проблемы только в последней строке.(Как правило, если последняя строка заканчивается '\n' и не является пустой, она появится в вашем массиве дважды.) Если, конечно, ваш файл не содержит более 200 строк.

Я мог быдобавьте, что еще более типичной идиомой было бы сделать str std::vector<std::string>, и написать цикл:

std::string line;
while ( std::getline( readSWDS, line ) ) {
    if ( !line.empty() ) {
        str.push_back(line);
    }
}

Это позволяет избежать определения фиксированного максимального числа строк.

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