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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
#1

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

29.03.2013, 19:13. Просмотров 367. Ответов 3
Метки нет (Все метки)

Почему вот такая функция, при 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++
C++ Потоки. Бинарный ввод/вывод
C++ Непонятная ошибка. Потоки ввода/вывода
C++ Ввод-вывод, потоки
Потоки ввода/вывода. Сохранение информации в файл и ее считывание оттуда C++
Игнорируются потоки ввода cin C++
C++ Переделать потоки ввода-вывода на prinf и scanf
Запустить интерпретатор bash, получить потоки ввода вывода C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21780 / 10504 / 1705
Регистрация: 12.02.2012
Сообщений: 17,504
29.03.2013, 19:13     Потоки ввода / вывод #2
Цитата Сообщение от bgm123 Посмотреть сообщение
пока они не кончатся в stdin.
- мне кажется, чтобы символы в stdin "кончились", нужно ввести CTRL-Z и Enter. Если этого не сделать, функция filecopy тоже будет ждать.
go
Эксперт C++
3584 / 1364 / 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
5410 / 4806 / 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     Потоки ввода / вывод
Ответ Создать тему
Опции темы

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