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

Потоки ввода / вывод - C++

Восстановить пароль Регистрация
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
29.03.2013, 19:13     Потоки ввода / вывод #1
Почему вот такая функция, при ifp = stdin читает символы пока они не кончатся в stdin.

C++
1
2
3
4
5
6
void filecopy(FILE *ifp, FILE *ofp){
    int c;
 
    while( (c = getc(ifp)) != EOF)
        putc(c, ofp);
}
А при таком вызове:

C++
1
getc(stdin)
при пустом stdin вместо возврата EOF программа ожидает символ?

Добавлено через 6 минут
Вот на таком примере давайте разберёмся. При первом вызове функции getc программа ожидает ввода, так как stdin пустой. Но при вызове функций getc в цикле, когда stdin становится пустым, программа не ожидает ввода, а возвращает EOF. Почему так происходит?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int ch;
 
    ch = getc(stdin);
    while(ch != EOF){
        putc(ch, stdout);
        ch = getc(stdin);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 19:13     Потоки ввода / вывод
Посмотрите здесь:

C++ потоки ввода/вывода.
Потоки ввода-вывода в С++ C++
C++ Используя потоки ввода/вывода в С++
C++ Текстовые файлы и потоки ввода/вывода
Потоки ввода-вывода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21490 / 10243 / 1668
Регистрация: 12.02.2012
Сообщений: 17,123
29.03.2013, 19:13     Потоки ввода / вывод #2
Цитата Сообщение от bgm123 Посмотреть сообщение
пока они не кончатся в stdin.
- мне кажется, чтобы символы в stdin "кончились", нужно ввести CTRL-Z и Enter. Если этого не сделать, функция filecopy тоже будет ждать.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
29.03.2013, 19:33     Потоки ввода / вывод #3
Цитата Сообщение от bgm123 Посмотреть сообщение
Почему вот такая функция, при ifp = stdin читает символы пока они не кончатся в stdin.
Потому что вы сами в цикле написали пока не конец файла.
Цитата Сообщение от bgm123 Посмотреть сообщение
при пустом stdin вместо возврата EOF программа ожидает символ?
Ожидание происходит.
Цитата Сообщение от bgm123 Посмотреть сообщение
программа не ожидает ввода, а возвращает EOF. Почему так происходит?
Она читает из буфера. Попробуйте вызвать ее в конце еще раз
Цитата Сообщение от bgm123 Посмотреть сообщение
while(ch != EOF){
* * * * putc(ch, stdout);
* * * * ch = getc(stdin);
* * }
После этого цикла еще раз getc(stdin);

Добавлено через 5 минут
Цитата Сообщение от go Посмотреть сообщение
После этого цикла еще раз getc(stdin);
Вызов 1 и из буфера он прочитает 1 раз. Но можно ввести буфер их много (до энтера, включая его).
Цитата Сообщение от bgm123 Посмотреть сообщение
Почему вот такая функция, при ifp = stdin читает символы пока они не кончатся в stdin.
Вы меня запутали. Работы этих функций аналогичная.

Цитата Сообщение от bgm123 Посмотреть сообщение
Почему вот такая функция, при ifp = stdin читает символы пока они не кончатся в stdin.
И что она ждать не будет?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 06:58     Потоки ввода / вывод #4
Цитата Сообщение от bgm123 Посмотреть сообщение
Вот на таком примере давайте разберёмся. При первом вызове функции getc программа ожидает ввода, так как stdin пустой. Но при вызове функций getc в цикле, когда stdin становится пустым, программа не ожидает ввода, а возвращает EOF. Почему так происходит?
Вы как это проверяете?

Добавлено через 15 минут
Поток с консоли это не файл, нет там EOF. Его нужно генерировать, поэтому никаких выходов из циклов, при чтении с консоли, ни в первом коде, ни во втором нет, пока не сгенерирован EOF. getc(stdin) будет считываеть всё из буфера и ждать следующего ввода.
Yandex
Объявления
30.03.2013, 06:58     Потоки ввода / вывод
Ответ Создать тему
Опции темы

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