Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 1
Регистрация: 27.11.2013
Сообщений: 52

ifstream: как работают операторы << и >>?

26.01.2014, 01:07. Показов 3915. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните, пожалуйста, языком "ребенка", как они работают? Не доходит!

Не понятно, как в этом цикле иттерирует объект:

C++
1
2
3
4
5
6
7
8
9
10
   ifstream fin("biblioteka.txt");//Открываем файл
 
        long in = 0;
        while(fin)//Не пойму, в нем счетчик или что?
        {
 
            if (fin >> books[in]) // как все это передается в массив?
               in++;
 
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2014, 01:07
Ответы с готовыми решениями:

Не работают перегруженные операторы
проблема такова: есть перегруженный оператор &quot;=&quot;, при вызове которого выполняется присвоение значений массива, однако же, результат...

Не работают логические операторы
Выдает такую ошибку, в интернете не понял как решить, тренируюсь по пособию, там код слово в слово

Не работают операторы сравнения в switch
Вот блин че то он ругаеться на знаки сравнения в case. Походу тут они не поддерживаються? Или как мне это реализовать.. таковы условия ...

9
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.01.2014, 01:34
Цитата Сообщение от WebSofter Посмотреть сообщение
while(fin)//Не пойму, в нем счетчик или что?
у потоков перегружен оператор приведения к типу void*(C++03)/bool(C++11)

Добавлено через 2 минуты
Цитата Сообщение от WebSofter Посмотреть сообщение
fin >> books[in]) // как все это передается в массив?
books[in] это не массив, а элемент массива, и где-то в твоем коде определен оператор >> как внешняя функция с двумя аргументами - потоком и "книгой"
0
62 / 62 / 33
Регистрация: 14.01.2014
Сообщений: 145
26.01.2014, 06:06
Цитата Сообщение от WebSofter Посмотреть сообщение
if (fin >> books[in])
in++;
Здесь fin работает аналогично cin: читает ввод до пробела и записывает его в следующий элемент массива
0
0 / 0 / 1
Регистрация: 27.11.2013
Сообщений: 52
26.01.2014, 09:57  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
у потоков перегружен оператор приведения к типу void*(C++03)/bool(C++11)
Не понятно, чуть-чуть поподробнее , пожалуйста.

Цитата Сообщение от Jupiter Посмотреть сообщение
books[in] это не массив, а элемент массива, и где-то в твоем коде определен оператор >> как внешняя функция с двумя аргументами - потоком и "книгой"
Мне нужно понять что эа функция делает, каков ее внутренний механизм и почему он такой нестандартный?

Добавлено через 2 минуты
Цитата Сообщение от vovacreme Посмотреть сообщение
Здесь fin работает аналогично cin: читает ввод до пробела и записывает его в следующий элемент массива
А что, если не пробел, а брейклайн?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
26.01.2014, 10:37
Цитата Сообщение от WebSofter Посмотреть сообщение
у потоков перегружен оператор приведения к типу void*(C++03)/bool(C++11)
Это значит, что при выполнении условных опреций типа while(fin), fin приводится к типу bool
(true - если в потоке еще что-то есть и false - если нету).
Цитата Сообщение от WebSofter Посмотреть сообщение
if (fin >> books[in]) // как все это передается в массив?
">>" - на самом деле - это обыкновенная функция, которая в данном случае
имеет примерно вид
C++
1
istream& operator>>(istream& fin,int* a);
int* написал в предположении, что books - это целочисленный массив.
Данные из потока читаются до первого символа, который не может считаться частью числа.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
26.01.2014, 12:08
while(fin) - здесь проверяется состояние потока. Если при чтении из потока произошла ошибка( например, если достигнут конец файла), while(fin) будет означать while( 0 ) и цикл будет завершён.
Приведённый ( в сообщении #1 от WebSofter ) код считывает данные из файла. А когда при чтении возникает ошибка, цикл завершается.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
26.01.2014, 18:34
Цитата Сообщение от WebSofter Посмотреть сообщение
Объясните, пожалуйста, языком "ребенка", как они работают? Не доходит!
По аналогии(для простоты обработчики ошибок и т.д., опущены)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <cstdio>
#include <iostream>
 
class Ifstream {
private:
  std::FILE* fp;
  bool eof;
  
public:
  Ifstream(const char* filename)
  : fp(std::fopen(filename, "r")), eof(false) {
    
  }
  
  ~Ifstream() {
    std::fclose(fp);
  }    
  
  operator bool() {
    return !eof; 
  }
  
  friend Ifstream& operator>>(Ifstream& stream, int& value) {
    std::fscanf(stream.fp, "%d", &value);    
    stream.eof = std::feof(stream.fp);    
    return stream;
  }
};
 
int main() {
  int value;
  Ifstream stream("input.txt");
    
  while(stream >> value) // while(operator>>(stream, value))
    std::cout << value << std::endl;
}
Выражение stream >> value это тоже, что и operator>>(stream, value), т.е. вызов специальной функции operator>>(23 строка). В данном случае эта функция читает очередное число из файла с помощью std::fscanf, и определяет не был ли достигнут конец файла. При достижении конца файла stream.eof примет значение true.
Когда stream >> value передаётся в while, которому необходимо логическое выражение, произойдёт попытка преобразования значения возвращаемого stream >> value(т.е., Ifstream&) в тип bool
C++
1
while(static_cast<bool>(stream >> value))
в этот момент будет вызвана специальная функция operator bool()(19 строка), которая собственно и вернёт логическое выражение !eof. Когда eof после очередного чтения примет значение true, цикл завершится. Приблизительно по тому же принципу работает и ifstream.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
26.01.2014, 19:19
Только operator bool/void* не проверяет eof...
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
26.01.2014, 20:50
Цитата Сообщение от Somebody Посмотреть сообщение
Только operator bool/void* не проверяет eof...
Да, но так было проще показать/объяснить ТС, как приведённый им код может работать вообще(мне кажется вопрос был именно об этом).
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
26.01.2014, 21:00
Так вроде больше похоже будет:
C++
1
2
3
4
5
stream.fail = std::fscanf(stream.fp, "%d", &value) != 1;
...
 operator bool() {
    return !fail;
  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2014, 21:00
Помогаю со студенческими работами здесь

Как работают операторы '->' и '=>'?
Заведомо знаю что в вопросе ошибка, это не операторы, я не знаю как это называется и поэтому не могу гуглить. Есть ли полное описание всех...

Как работают операторы > и < с массивами?
Есть такой код: $arr1 = array(4, 8, 12); $arr2 = array(5, 1, 7); if($arr1 &gt; $arr2) echo &quot;4,8,12&quot;.$arr1; ...

Как работают операторы сравнения
Sub ¹1() a = 3 b = 4 c = 5 d = 6 If (c &lt; d &lt; a) Then MsgBox (&quot;не кул&quot;) End If

Объяснить как работают операторы
Всем привет, не шарю в программировании, нужно защитить работу в унике. Подскажите плиз, как работают: if...else do...while ...

Как работают операторы # и % и чем отличаются от ## и %%?
Толи я не понимаю, толи делаю неправильно... почему не работают данные операторы? ${123456#34} ${123456##34} ${123456%34} ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru