Форум программистов, компьютерный форум CyberForum.ru

std::cin, eof не всегда принимается как признак конца файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
16.09.2012, 13:32     std::cin, eof не всегда принимается как признак конца файла #1
C++
1
2
3
4
5
std::string text;
    char ch = 0;
    while(!std::cin.get(ch).eof()){
        text.append(1, ch);
    }
Ввожу в консоль в Windows:
"^Z" (ctrl-z) ok, из цикла выходит
"g\n^Z" (\n - новая строка) ok, из цикла выходит.
"g^Z" из цикла не выходит.

Как устанавливать признак конца файла в консоли, чтобы всегда работало или как исправить код выше?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2012, 13:32     std::cin, eof не всегда принимается как признак конца файла
Посмотрите здесь:

Как исправить ошибку с std::cin C++
C++ Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
cin.eof и cin.fail C++
C++ признак конца файла
C++ Не работает std::cout || std::cin
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
16.09.2012, 14:06     std::cin, eof не всегда принимается как признак конца файла #2
Боюсь, что это особенность Windows, что ^Z воспринимается только в начале строки.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
16.09.2012, 14:11  [ТС]     std::cin, eof не всегда принимается как признак конца файла #3
Туплю( Забываю пользоваться поиском. С первого же раза нашел в гугле как это сделать.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
16.09.2012, 14:16     std::cin, eof не всегда принимается как признак конца файла #4
Вообще, функциональность не должна измениться, если написать короче:
C++
1
2
3
4
5
    std::string text;
    char ch = 0;
    while(std::cin.get(ch)){
        text.append(1, ch);
    }
Кстати, в линуксе эта программа на ^D не в начале строки тоже реагирует не с первого раза. По первому нажатию ^D происходит чтение из буфера и обработка всех символов и только второе завершает ввод. Когда же ^D вводится в начале строки (то есть для пустого буфера), то ввод сразу завершается.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
16.09.2012, 15:55  [ТС]     std::cin, eof не всегда принимается как признак конца файла #5
Сделал таким способом:
C++
1
2
3
4
5
6
7
// don't skip the whitespace while reading
    std::cin >> std::noskipws;
 
    // use stream iterators to copy the stream to a string
    std::istream_iterator<char> it(std::cin);
    std::istream_iterator<char> end;
    std::string result(it, end);
Yandex
Объявления
16.09.2012, 15:55     std::cin, eof не всегда принимается как признак конца файла
Ответ Создать тему
Опции темы

Текущее время: 08:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru