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

Для чего нужен EOF?

07.10.2010, 13:47. Показов 88595. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
задание такое:написать программу, печатающую все вводимые символы в верхнем регистре, в строку выодится 16ричный и 8ричный код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <iomanip>
 
void main()
{ 
    using namespace std;
    char ch = 0;
    while(!cin.eof()) {
        ch=cin.get();
        cout<<toupper(ch)<<" | "<<hex<<ch<<" | "<<oct<<ch;
    }
}
может кто нибудь обьяснить для чего здесь нужен EOF (end of file), о каком файле здесь идет речь?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2010, 13:47
Ответы с готовыми решениями:

Для чего нужен C++?
Уважаемые, я учу C++ уже 7 лет, зачем нужен C++?

Для чего нужен с++?
Я школьник, мне 16 лет, учусь в 10 классе, планирую поступить на факультет защиты информационных...

Для чего нужен конструктор?
если несложно, то объясните для чего нужен конструктор? я прочитал, что он требуется для...

Для чего нужен break?
для чего нужен break?

24
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
07.10.2010, 13:59 2
End of File это не только файл, как может показаться не первый взгляд.
В компьютерной терминологии end-of-file (конец файла) или просто EOF, является индикатором операционной системы означающим, что данные в источнике закончились. Источниками данных, обычно, являются файлы и потоки.
1
246 / 178 / 47
Регистрация: 14.06.2010
Сообщений: 422
07.10.2010, 14:01 3
может кто нибудь обьяснить для чего здесь нужен EOF (end of file),
Не нужен он тут особо , возьми и организуй цикл по другому


fasked , получаутся что-то вроде бесконечного цикла???
0
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
07.10.2010, 14:57 4
!cin.eof() нужно чтобы прекратить цикл при прекращение ввода если бы в условии было ch = cin.get() то цикл бы зациклился ведь false это 0 а eof на большинстве систем -1. таким образом !cin.eof() возвращает 0 только при достижении конца потока/файла.

Добавлено через 12 минут
ещё можно так написать
C++
1
2
3
while (ch = cin.get()) != EOF) {
бла бла бла;
}
но для этого <cstdio> нужен
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
07.10.2010, 15:23 5
zikker, ios::eof и EOF совершенно разные вещи, не стоит их мешать и уж тем более не факт, что это должно работать.
0
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
07.10.2010, 17:33 6
Цитата Сообщение от fasked Посмотреть сообщение
уж тем более не факт, что это должно работать.
Сразу оговорюсь что C/C++ учу около недели но этот пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
using namespace std;
 
int main (int argc, char *argv[]) {
    char ch;
    while (!cin.eof()) {
        ch = cin.get();
        cout << ch << cin.eof() << endl;
    }
    cout << cin.eof() << endl;
    return 0;
}
как бы работает(выводит еденицу только после ctrl d). Хотя могу и ошибаться.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
08.10.2010, 03:34 7
C++
1
while (cin.is_good())
ошибка чтения вроде не выставляет eof флаг, is_good может не вариант, но eof точно не вариант
0
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
08.10.2010, 13:04 8
Цитата Сообщение от accept Посмотреть сообщение
шибка чтения вроде не выставляет eof флаг
Я не это имел ввиду просто cin.eof свидетельствует о прекращение ввода и
while (ch = cin.get()) != EOF)
по сути эквивалентно
while (!cin.eof())
ch = cin.get();

Цитата Сообщение от accept Посмотреть сообщение
но eof точно не вариант
мой пример вроде как и работает(если не прав то поправьте ибо школота).
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
08.10.2010, 14:29 9
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от accept Посмотреть сообщение
ошибка чтения вроде не выставляет eof флаг, is_good может не вариант, но eof точно не вариант
Поправочка, не is_good, а просто good.
ios::good - false, если любой из флагов состояний (eofbit, failbit, badbit) активен, то есть и при достижении конца потока/файла и при ошибки чтения/записи.
ios::fail - true, если любой из флагов состояний failbit или badbit активен, то есть проверка только на ошибки.
ios::bad - проверка только флага badbit.

Сами же флаги состояний описывают следующие свойства:
eofbit - конец потока/файла.
failbit - последняя операция завершилась неуспешно в связи с ошибкой в логике самой операции.
badbit - операция завершена неуспешно в связи с отказом записи (или чтения) в поток.
goodbit - нет никаких ошибок.

Поправьте, если не прав.
4
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
08.10.2010, 18:48 10
Цитата Сообщение от fasked Посмотреть сообщение
eofbit - конец потока/файла.
как я и говорил.
Цитата Сообщение от zikker Посмотреть сообщение
!cin.eof() нужно чтобы прекратить цикл при прекращение ввода
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.10.2010, 13:25 11
Цитата Сообщение от zikker Посмотреть сообщение
мой пример вроде как и работает
Он только eofbit проверяет. А если cin - файл с другого компа или с флешки, а сеть отключилась и флешку вынули, eofbit'а не будет. Будет badbit.
0
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
09.10.2010, 14:39 12
задание такое:написать программу, печатающую все вводимые символы в верхнем регистре
как я это понял имелся ввиду именно ввод из консоли а не считывание файла или сокета.
Вопрос что такое .eof() а не что использовать.
И мой пример показывает как он работает.(про eofbit никто не спрашивал).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
using namespace std;
 
int main (int argc, char *argv[]) {
        char ch;
    while (!cin.eof()) {
        ch = cin.get();
        cout << "ch = " << ch << " cin.eof() = " << cin.eof() << " cin.eofbit " << cin.eofbit << endl;
    }
    cout << " cin.eof() " << cin.eof() << " cin.eofbit " << cin.eofbit <<  endl;
    return 0;
}
Вывод !cin.eof() для определения конца ввода.(по ctrl d или ctrl z(или что там в windows)).
0
11 / 11 / 2
Регистрация: 09.10.2010
Сообщений: 23
09.10.2010, 14:53 13
В cin может и файл загоняться: myprog.exe < my.text
Ну и как выше написали сработает на Ctrl-Z или Ctrl-D в зависимости от системы, если вводить руками.
0
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
09.10.2010, 16:41 14
Цитата Сообщение от StUser Посмотреть сообщение
myprog.exe < my.text
C++
1
2
3
4
5
6
7
8
9
#include <cstdio>
 
int main (int argc, char *argv[]) {
    freopen ("./file", "r", stdin);
    char str[80];
    scanf("%s", str);
    printf("%s", str);
    return 0;
}
Можно и так. +А почему в этом примере cin.getline() не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
 
int main (int argc, char *argv[]) {
    freopen ("./file", "r", stdin);
    string str;
    cin.getline() >> str;
    cout << str;
    return 0;
}
хотя просто cin >> str функционирует ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.10.2010, 16:58 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
 
int main (int argc, char *argv[]) {
    freopen ("./file", "r", stdin);
    string str;
    getline(cin, str);
    cout << str;
    return 0;
}
Добавлено через 10 минут
П.С. Это не самый лучший способ для С++ потоков.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <fstream>
#include <string>
#include <iostream>
 
int main()
{
    std::streambuf* backup;
    std::string Str;
    backup=std::cin.rdbuf();
    std::ifstream ifs("Test.txt");
    std::cin.rdbuf(ifs.rdbuf());
    std::getline(std::cin, Str);
    std::cout<<Str<<'\n';
    std::cin.rdbuf(backup);
    std::cin>>Str;
    std::cout<<Str<<'\n';
    return 0;
}
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
10.10.2010, 06:19 16
Цитата Сообщение от zikker
как я это понял имелся ввиду именно ввод из консоли а не считывание файла или сокета
ошибка может и в консоли произойти (не прямо вот в окне, а в том источнике, куда кладутся символы, пока они не прочитаны), в таком случае cin.eof() никогда не наступит и цикл, отслеживающий это дело, повиснет
0
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
10.10.2010, 16:05 17
Цитата Сообщение от accept Посмотреть сообщение
ошибка может и в консоли произойти
А кто говорит(печатает) про ошибки ?
Вопрос зачем .eof()
Ответ для определения конца ввода
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.10.2010, 02:22 18
Цитата Сообщение от fasked Посмотреть сообщение
Поправочка, не is_good, а просто good.
ios::good - false, если любой из флагов состояний (eofbit, failbit, badbit) активен, то есть и при достижении конца потока/файла и при ошибки чтения/записи.
ios::fail - true, если любой из флагов состояний failbit или badbit активен, то есть проверка только на ошибки.
ios::bad - проверка только флага badbit.

Сами же флаги состояний описывают следующие свойства:
eofbit - конец потока/файла.
failbit - последняя операция завершилась неуспешно в связи с ошибкой в логике самой операции.
badbit - операция завершена неуспешно в связи с отказом записи (или чтения) в поток.
goodbit - нет никаких ошибок.

Поправьте, если не прав.
тут различие есть


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(void)
{
    fstream f;
    
    cout << cin.good() << endl;
    
    cout << f.is_open() << endl;
    
    cout << f.good() << endl;
    
    //cout << cin.is_open() << endl; // не срабатывает
    
    return 0;
}
Код
[guest@localhost tests]$ g++ t.cpp -o t
[guest@localhost tests]$ ./t
1
0
1
[guest@localhost tests]$ g++ t.cpp -o t
t.cpp: In function ‘int main()’:
t.cpp:17: ошибка: ‘struct std::istream’ has no member named ‘is_open’
[guest@localhost tests]$


Добавлено через 6 минут
Цитата Сообщение от zikker Посмотреть сообщение
А кто говорит(печатает) про ошибки ?
Вопрос зачем .eof()
Ответ для определения конца ввода
Цитата Сообщение от zikker
C++
1
while (ch = cin.get()) != EOF)
по сути эквивалентно
C++
1
while (!cin.eof())
нет, вот как раз первый вариант сделан хоть и неправильно, но если его составить правильно, выйдет из цикла по ошибке, а второй вариант, встретив ошибку в середине cin, просто зациклится

программа должна выйти и сообщить, что встречена ошибка, а не зацикливаться, естественно ничего не сообщая

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main(void)
{
    char ch;
    
    while (cin.get(ch))
        cout << ch;
    
    cout << endl;
    
    return 0;
}
здесь после цикла ничего не проверяется, но необходимо вставить проверку потока cin, не было ли в нём ошибки
потому что оно могло прочитать поток до половины, а потом выйти, потому что дальше не читается
0
0 / 0 / 0
Регистрация: 10.09.2010
Сообщений: 10
13.10.2010, 16:58  [ТС] 19
ладно, а можно цикл организовать не используя eof? можете написать?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.10.2010, 03:25 20
C++
1
2
3
4
5
6
7
8
9
    while (cin.get(ch))
        cout << toupper(ch)
             << " | "
             << hex
             << ch
             << " | "
             << oct
             << ch
             << endl;
0
14.10.2010, 03:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2010, 03:25
Помогаю со студенческими работами здесь

Для чего нужен rdstate()
Например cout&lt;&lt;&quot;sdxcfc&quot;&lt;&lt;output.rdstate(); Где output объект ostrstream

Для чего нужен Sizeof
Вот строка memcpy(pMatrPr, pMatr, sizeof(double) * n * m); Это копирование исходной матрицы в...

Для чего нужен символ \b?
для чего нужен символ \b??

Для чего нужен define?
Для чего нужен оператор define? например код #define N 20 /* сколько первых...

Для чего нужен указатель vptr?
для чего нужен указатель vptr?? насколько я знаю, он указывает на таблицу виртуальных функций, а...

Для чего нужен класс auto_ptr_ref?
Здравствуйте, можно поконкретней, для чего нужен класс auto_ptr_ref? Спасибо.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru