Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Классы (статические члены и конструктор копирования) https://www.cyberforum.ru/ cpp-beginners/ thread1279661.html
Добрый вечер! Написал программку, все нормально работает, но есть два нюанса: необходимо сделать счетчик количества записей через статический член класса и функцию создания базы учеников с задолженностью (<45 баллов) через конструктор копирования. Пытался разобраться по Шилдту, потом по форумам в итоге окончательно запутался. Код прилагаю с моими попытками сделать конструктор копирования. ...
C++ Получить все делители числа q, взаимно простые к p
Даны натуральные числа p и q. Получить все делители числа q, взаимно простые к p. помогите пожалуйста.
C++ Многофайловый проект с функциями в классе https://www.cyberforum.ru/ cpp-beginners/ thread1279659.html
создаю класс в ней функцию и запихиваю все программу, все работает. Но мне нужно сделать несколько функций я разбиваю программу создаю файлы сpp, и при выполнении выдается ошибка. Помогите решить проблему программа 1 файл: #include <fstream> #include "Header.h" #include <conio.h> void Matrix::size() {
C++ Pascal -> C++ Преобразовал код Pascal в код C++, но при вводе значений в код Pascal 1 и 2 программа выводит правильный результат, равный 363. Когда я ввожу цифры 1 и 2 в код, написанный на C++, то программа выдаёт 370. Скажите, пожалуйста, где я не так переписал код: var m, d, count, i: integer; function CountDay(m: integer): integer; begin if (m >= 1) then countday := 31; if (m >= 2) then... https://www.cyberforum.ru/ cpp-beginners/ thread1279652.html
C++ Какое расстояние проходит свет за час? за сутки?
Помогите надо сделать практическую работу. Короткий опис головного меню і основні клавіші керування IDE Borland С++ 3.1; Формалізацію поставленого завдання методом покрокової деталізації; Блок-схеми алгоритмів; Опис змінних ,які застосовуються у програмі; Лістинги програм, створених на лабораторній роботі; Результат виконання програм (для кожного прикладу). Висновки. Вот...
C++ Перевести с десятичной в двоичную систему счисления Есть ли какой метод в С++ для этого или надо самому писать метод))? https://www.cyberforum.ru/ cpp-beginners/ thread1279640.html
C++ Вывод структуры, строка как элемент структуры https://www.cyberforum.ru/ cpp-beginners/ thread1279629.html
Описать структуру с именем TRAIN, содержащую следующие поля: □ название пункта назначения; □ номер поезда; □ время отправления. Написать программу, выполняющую следующие действия: □ ввод с клавиатуры данных в массив, состоящий из шести элементов типа TRAIN; записи должны быть упорядочены по времени отправления поезда; □вывод на экран информации о поездах, направляющихся в пункт,...
Массивы векторы C++
Здравствуйте,недавно начал изучать c++.Разобрался с циклами,списками,указателями и недавно научился выделять динамическую память под массивы.В ходе последней темы возник вопрос : зачем вообще нужны массивы,если есть векторы? (как я понял для векторов уже все основные алгоритмы написаны). С какой книги стоит продолжить обучение,при условии,что я знаю вышеперечисленное? Заранее спасибо)
C++ Шифрование перестановкой с ключом https://www.cyberforum.ru/ cpp-beginners/ thread1279613.html
Помогите найти ошибку, неправильно выводит зашифрованноое сообщение #include<stdio.h> #include<conio.h> #include<string.h> void main() { char Message,Code1,Code2,Code3,Key; int Message_Length,Key_Length,rows=0,End_i,End_j,columns,i,j,k; clrscr(); Label1: puts("MESSAGE :"); gets(Message);
C++ [Linker Error] undefined reference to https://www.cyberforum.ru/ cpp-beginners/ thread1279603.html
Вызываю так функцию в main'e: #include <cstdlib> #include <iostream> #include <iomanip> #include "matrix.h" using namespace std; const int n = 3;
C++ Пересечение треугольников в 3d
Вот например 2 треугольника: (для примера) struct Point { int X; int Y; int Z; };
C++ Найдите ошибку в следующем фрагменте программы https://www.cyberforum.ru/ cpp-beginners/ thread1279579.html
Найдите ошибку в следующем фрагменте программы: #include <iostream> int main() { int* pint; *pint = 9; cout << "pint: " << *pint; return 0; }
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.10.2014, 13:03 0

Почему если флаг состояния потока eof поднят, то флаг good опущен? - C++ - Ответ 6744075

20.10.2014, 13:03. Показов 2790. Ответов 15
Метки (Все метки)

Ответ

Порылся немного в исходниках. Как я понял, прикол с eof возникает из-за различий в реализации цикла чтения из потока. В студии (VS2010) он такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (; 0 < _Size; --_Size, _Meta = _Istr.rdbuf()->snextc())
            if(_Traits::eq_int_type(_Traits::eof(), _Meta))
                {   // end of file, quit
                _State |= ios_base::eofbit;
                break;
                }
            else if (_Ctype_fac.is(_Ctype::space,
                _Traits::to_char_type(_Meta)))
                break;  // whitespace, quit
            else
                {   // add character to string
                _Str.append(1, _Traits::to_char_type(_Meta));
                _Changed = true;
                }
Т.е. проверка возврата snextc() на eof идет внутри цикла чтения (строки 2-4).
В gcc же имеем такой код (источник):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  while (__extracted < __n
              && !_Traits::eq_int_type(__c, __eof)
              && !__ct.is(__ctype_base::space,
                  _Traits::to_char_type(__c)))
         {
           if (__len == sizeof(__buf) / sizeof(_CharT))
             {
               __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
               __len = 0;
             }
           __buf[__len++] = _Traits::to_char_type(__c);
           ++__extracted;
           __c = __in.rdbuf()->snextc();
         }
           __str.append(__buf, __len);
 
           if (_Traits::eq_int_type(__c, __eof))
         __err |= __ios_base::eofbit;
           __in.width(0);
         }
И теперь уже проверка на eof вынесена из цикла чтения (строки 17-18).
Поэтому как раз наблюдаем ситуацию: прочитали нормально n символов, но внутри считался ещё 1 дополнительно перед выходом из цикла. И после выхода как раз выставился eof (чего в варианте VS не происходит).

Стандарт же на этот счет говорит всего лишь следующее 21.4.8.9:
Inserters and extractors [string.io]
C++
1
2
3
4
template<class charT, class traits, class Allocator>
basic_istream<charT,traits>&
operator>>(basic_istream<charT,traits>& is,
basic_string<charT,traits,Allocator>& str);
1 Effects: Behaves as a formatted input function (27.7.2.2.1). After constructing a sentry object, if the
sentry converts to true, calls str.erase() and then extracts characters from is and appends them to
str as if by calling str.append(1,c). If is.width() is greater than zero, the maximum number n
of characters appended is is.width(); otherwise n is str.max_size(). Characters are extracted and
appended until any of the following occurs:
— n characters are stored;
— end-of-file occurs on the input sequence;
— isspace(c,is.getloc()) is true for the next available input character c.
2 After the last character (if any) is extracted, is.width(0) is called and the sentry object k is destroyed.
3 If the function extracts no characters, it calls is.setstate(ios::failbit), which may throw ios_-base::failure (27.5.5.4).
4 Returns: is
Т.е. мы должны выйти из чтения по условию "n characters are stored;", после вызвать is.width(0) и уничтожить sentry объект. п.3 по идее сработать не должен. Т.о. имхо студия ведёт себя более правильно относительно Стандарта.
Но вот можно ли при этом утверждать что gcc не соответствует Стандарту, я не особо уверен.

Вернуться к обсуждению:
Почему если флаг состояния потока eof поднят, то флаг good опущен? C++
1
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2014, 13:03
Готовые ответы и решения:

Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят?
#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;sstream&gt; using namespace std; int main()...

Нарисовать на экране дисплея флаг РФ, Японский флаг
Нарисовать на экране дисплея флаг РФ, Японский флаг 300*200px Добавлено через 22 часа 20 минут ...

Получить флаг о готовности данных от дочернего потока
Доброго времени суток. Имеется следующая разработка: мини-прога, набор небольших утилит, основная...

Олимпийский флаг, почему не рисуется?
Нужно, чтобы выводился олимпийский флаг, а выводится пустая форма. Почему так? Код: unit...

15
20.10.2014, 13:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2014, 13:03
Помогаю со студенческими работами здесь

Сколькими способами можно сшить трехцветный флаг, если есть ткани 5 различных цветов?
Сколькими способами можно сшить трехцветный флаг, если есть ткани 5 различных цветов?

Сколькими способами можно сделать флаг с горизонтальными полосами одинаковой ширины, если есть материя 6 разных цветов,
Сколькими способами можно сделать флаг с горизонтальными полосами одинаковой ширины, если есть...

Задана 32-х битная переменная и набор 32-битных флагов. Если бит в заданной переменной равен единице то считать,что соответствующий флаг установлен...
Задана 32-х битная переменная и набор 32-битных флагов. Если бит в заданной переменной равен...

Почему событие eof() файлового потока наступает очень поздно? Какова вообще его логика?
Вот пример, если в папке с программой разместить файл input.txt с числами &quot;1 2 3&quot;, то в векторе...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru