2010-08-30 2 views
7

Я запускаю себя через текстовый учебник на C++, который у меня есть для обновления программирования на C++. Одна из проблем практики (не вдаваясь в подробности) требует, чтобы я определял функцию, которая может быть передана ifstream или cin (например, istream) в качестве аргумента. Оттуда я должен прочитать поток. Проблема в том, что я не могу понять, как использовать этот инструмент и эффективно использовать конец потока. А именно:Найдите конец потока для cin & ifstream?

while(input_stream.peek() != EOF) 

не будет работать для cin. Я мог бы переработать функцию, чтобы найти определенную фразу (например, «#End of Stream #» или что-то в этом роде), но я думаю, что это плохая идея, если поток файлов, который я передаю, имеет эту точную фразу.

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

+0

Проверить этот вопрос: http://stackoverflow.com/questions/3197025/end-of-fileeof-of-standard-input -stream-stdin – Archie

ответ

4

eof(). произведение для cin. Вы делаете что-то неправильно; отправьте свой код. Один из стандартных камней преткновения заключается в том, что флаг eof устанавливается после, который вы пытаетесь прочитать за концом потока.

Вот демонстрация:

#include <iostream> 
#include <string> 

int main(int, char*[]) 
{ 
    std::string s; 
    for (unsigned n = 0; n < 5; ++n) 
    { 
     bool before = std::cin.eof(); 
     std::cin >> s; 
     bool after = std::cin.eof(); 
     std::cout << int(before) << " " << int(after) << " " << s << std::endl; 
    } 

    return 0; 
} 

и его выход:

D:>t 
aaaaa 
0 0 aaaaa 
bbbbb 
0 0 bbbbb 
^Z 
0 1 bbbbb 
1 1 bbbbb 
1 1 bbbbb 

(EOF может быть сгенерирован с помощью Ctrl-Z на Windows, и Ctrl-D на многих других операционных систем)

+0

Извините за путаницу, изначально у меня было (! Input_stream.eof()), но затем понял, что я написал while (input_stream.peek! = EOF). Независимо от того, оба метода работают с control + z (по иронии судьбы, я просто читал о персонаже eof в википедии). Спасибо за помощь atzz, и всем! – user435219

+0

Предпочитаете преобразовать поток в логическое значение над '.eof' или' .bad'. –

2

Почему не будет std::cin.eof() работы? cin будет сигнализировать EOF, когда stdin закрывается, что произойдет, когда пользователь сигнализирует об этом с помощью Ctrl + d (* nix) или Ctrl + z (Windows) или (в случае потокового входного потока), когда канал конец файла

+1

В Windows это 'Ctrl + Z',' Ctrl + D' для UNIX-систем. – Archie

+0

@Archie О, хорошая точка; добавлено, что в –

+0

А, это действительно работает (хорошо Ctrl + Z для окон в любом случае). Извините, если есть небольшая путаница, как я изначально имел (! Input_stream.eof()) в post before и отредактировал ее до while (input_stream.peek()! = EOF). В любом случае, я имею в виду использование while (! Input_stream.eof()) в том, что когда функция читает символ EOF, бит сбоя устанавливается для input_stream. Это должно произойти? – user435219

3

Если вы используете поток в булевом контексте, он преобразует себя в значение, эквивалентное true, если оно не достигло EOF и false, если была сделана попытка прочитать прошлое EOF (не это также является ложным, если в потоке было обнаружено предыдущее сообщение об ошибке).

Поскольку большинство операций ввода-вывода в потоках возвращают поток (поэтому их можно сковать). Вы можете выполнить операцию чтения и использовать результат в тесте (как указано выше).

Так программа для чтения потока чисел из потока:

int main() 
{ 
    int x; 

    // Here we try and read a number from the stream. 
    // If this fails (because of EOF or other error) an internal flag is set. 
    // The stream is returned as the result of operator>> 
    // So the stream is then being used in the boolean context of the while() 
    // So it will be converted to true if operator>> worked correctly. 
    //       or false if operator>> failed because of EOF 
    while(std::cin >> x) 
    { 
     // The loop is only entered if operator>> worked correctly. 
     std::cout << "Value: " << x << "\n"; 
    } 

    // Exit when EOF (or other error). 
} 
Смежные вопросы