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

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

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

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

29.03.2013, 19:13. Просмотров 404. Ответов 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);
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 19:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потоки ввода / вывод (C++):

Что такое потоки ввода, потоки вывода? - C++
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Потоки ввода-вывода - C++
1) Типы данных, для которых перегружены операторы форматного ввода-вывода.

Потоки ввода-вывода в С++ - C++
Ребят, нужна помощь В программирование я новичок, но сдать нужно 1. Написать программу, печатающую символы. Использовать цикл while....

Потоки ввода вывода - C++
Почему с помощью классов ostream и istream нельзя создавать свои потоки ввода вывода? std::ostream output; output &lt;&lt; &quot;String&quot;; К...

Игнорируются потоки ввода cin - C++
Здравствуйте! У меня такая проблема: в консольном приложении на C++ игнорируются некоторые потоки ввода cin. А если я введу какие-либо...

Используя потоки ввода/вывода в С++ - C++
Здравствуйте помогите организовать запись информации из массива объектов в класс, чтение данной информации из класса, ввод информации с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Catstail
Модератор
22616 / 10977 / 1779
Регистрация: 12.02.2012
Сообщений: 18,120
29.03.2013, 19:13 #2
Цитата Сообщение от bgm123 Посмотреть сообщение
пока они не кончатся в stdin.
- мне кажется, чтобы символы в stdin "кончились", нужно ввести CTRL-Z и Enter. Если этого не сделать, функция filecopy тоже будет ждать.
1
go
Эксперт C++
3586 / 1366 / 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.
И что она ждать не будет?
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 06:58 #4
Цитата Сообщение от bgm123 Посмотреть сообщение
Вот на таком примере давайте разберёмся. При первом вызове функции getc программа ожидает ввода, так как stdin пустой. Но при вызове функций getc в цикле, когда stdin становится пустым, программа не ожидает ввода, а возвращает EOF. Почему так происходит?
Вы как это проверяете?

Добавлено через 15 минут
Поток с консоли это не файл, нет там EOF. Его нужно генерировать, поэтому никаких выходов из циклов, при чтении с консоли, ни в первом коде, ни во втором нет, пока не сгенерирован EOF. getc(stdin) будет считываеть всё из буфера и ждать следующего ввода.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 06:58
Привет! Вот еще темы с ответами:

Непонятная ошибка. Потоки ввода/вывода - C++
Решал задачу и столкнулся с проблемой (первый день на c++ &quot;пишу&quot;) не пойму что за ошибка #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Текстовые файлы и потоки ввода/вывода - C++
Доброго времени суток. Уважаемый гуру, не могли бы вы мне помочь с решением данной программы. Алгоритм знаю, но никак не могу его...

Очередной по getline() или потоки ввода - C++
Всем привет! :drink: Ребятки, такая трабла, прога добавляет студентов в группу, при добавлении 2го студента ф-ция getline() непонятно для...

Переделать потоки ввода-вывода на prinf и scanf - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int x,y,i,j,n1,m1,n2,m2,z; void cret(void) { cout&lt;&lt;&quot;\nVvedit...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.03.2013, 06:58
Ответ Создать тему
Опции темы

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