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

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

Войти
Регистрация
Восстановить пароль
 
WebSofter
0 / 0 / 0
Регистрация: 27.11.2013
Сообщений: 52
#1

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

26.01.2014, 01:07. Просмотров 822. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2014, 01:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ifstream: как работают операторы << и >>? (C++):

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

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

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

Различия ifstream::get() и ifstream::get(ch) - C++
Доброго времени суток. Была тут тема, в которой я не разобрался до конца. Код ниже проверяет баланс скобок в текстовом файле #include...

С++.Операторы в С++: условные операторы, операторы break и continue - C++
Выяснить, пересекаются ли параболы у=аx2+bx+с и у=dx2+ex + f. При положительном ответе найти точки пересечения.

Как определить размер фаила с ifstream или как-то по другому? - C++
Как определить размер фаила с помощью ifstream или как-то по другому?

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от vovacreme Посмотреть сообщение
Здесь fin работает аналогично cin: читает ввод до пробела и записывает его в следующий элемент массива
А что, если не пробел, а брейклайн?
0
zss
Модератор
Эксперт С++
6542 / 6104 / 2012
Регистрация: 18.12.2011
Сообщений: 15,882
Завершенные тесты: 1
26.01.2014, 10:37 #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 - это целочисленный массив.
Данные из потока читаются до первого символа, который не может считаться частью числа.
0
Alex5
1087 / 748 / 116
Регистрация: 12.04.2010
Сообщений: 1,911
26.01.2014, 12:08 #6
while(fin) - здесь проверяется состояние потока. Если при чтении из потока произошла ошибка( например, если достигнут конец файла), while(fin) будет означать while( 0 ) и цикл будет завершён.
Приведённый ( в сообщении #1 от WebSofter ) код считывает данные из файла. А когда при чтении возникает ошибка, цикл завершается.
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
26.01.2014, 18:34 #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.
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
26.01.2014, 19:19 #8
Только operator bool/void* не проверяет eof...
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
26.01.2014, 20:50 #9
Цитата Сообщение от Somebody Посмотреть сообщение
Только operator bool/void* не проверяет eof...
Да, но так было проще показать/объяснить ТС, как приведённый им код может работать вообще(мне кажется вопрос был именно об этом).
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
26.01.2014, 21:00 #10
Так вроде больше похоже будет:
C++
1
2
3
4
5
stream.fail = std::fscanf(stream.fp, "%d", &value) != 1;
...
 operator bool() {
    return !fail;
  }
0
26.01.2014, 21:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 21:00
Привет! Вот еще темы с ответами:

Как открыть файл в потоке ifstream? - C++
если имя файла храниться в переменной String s;

Ifstream& как член класса - C++
Здравствуйте. Решаю задачу: Напишите функцию, получающую и качестве аргументов istream и vector&lt;string&gt; и возвращающую map&lt;string,...

Как повторно открыть файл ifstream - C++
Есть функция int readFile(char* outAdres){ int j(0); fstream inFile; for(QVector&lt;string&gt;::iterator it = files.begin()...

Как считать из бинарного файла AnsiString (ifstream)? - C++
ifstream read(&quot;Edit1.txt&quot;,std::ios::binary); int Size; read.read((char*)&amp;Size,sizeof(int)); AnsiString str; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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