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

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

Восстановить пароль Регистрация
 
WebSofter
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 52
26.01.2014, 01:07     ifstream: как работают операторы << и >>? #1
Объясните, пожалуйста, языком "ребенка", как они работают? Не доходит!

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

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++;
 
        }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.01.2014, 01:34     ifstream: как работают операторы << и >>? #2
Цитата Сообщение от WebSofter Посмотреть сообщение
while(fin)//Не пойму, в нем счетчик или что?
у потоков перегружен оператор приведения к типу void*(C++03)/bool(C++11)

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

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

Добавлено через 2 минуты
Цитата Сообщение от vovacreme Посмотреть сообщение
Здесь fin работает аналогично cin: читает ввод до пробела и записывает его в следующий элемент массива
А что, если не пробел, а брейклайн?
zss
Модератор
Эксперт С++
 Аватар для zss
5952 / 5557 / 1787
Регистрация: 18.12.2011
Сообщений: 14,201
Завершенные тесты: 1
26.01.2014, 10:37     ifstream: как работают операторы << и >>? #5
Цитата Сообщение от 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 - это целочисленный массив.
Данные из потока читаются до первого символа, который не может считаться частью числа.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
26.01.2014, 12:08     ifstream: как работают операторы << и >>? #6
while(fin) - здесь проверяется состояние потока. Если при чтении из потока произошла ошибка( например, если достигнут конец файла), while(fin) будет означать while( 0 ) и цикл будет завершён.
Приведённый ( в сообщении #1 от WebSofter ) код считывает данные из файла. А когда при чтении возникает ошибка, цикл завершается.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
26.01.2014, 18:34     ifstream: как работают операторы << и >>? #7
Цитата Сообщение от 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.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
26.01.2014, 19:19     ifstream: как работают операторы << и >>? #8
Только operator bool/void* не проверяет eof...
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
26.01.2014, 20:50     ifstream: как работают операторы << и >>? #9
Цитата Сообщение от Somebody Посмотреть сообщение
Только operator bool/void* не проверяет eof...
Да, но так было проще показать/объяснить ТС, как приведённый им код может работать вообще(мне кажется вопрос был именно об этом).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 21:00     ifstream: как работают операторы << и >>?
Еще ссылки по теме:

Ifstream& как член класса C++
Операторы языка С++: операторы цикла (исправьте программу) C++
Как повторно открыть файл ifstream C++

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

Или воспользуйтесь поиском по форуму:
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
26.01.2014, 21:00     ifstream: как работают операторы << и >>? #10
Так вроде больше похоже будет:
C++
1
2
3
4
5
stream.fail = std::fscanf(stream.fp, "%d", &value) != 1;
...
 operator bool() {
    return !fail;
  }
Yandex
Объявления
26.01.2014, 21:00     ifstream: как работают операторы << и >>?
Ответ Создать тему
Опции темы

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