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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 206, средняя оценка - 4.96
komunisten
0 / 0 / 0
Регистрация: 10.09.2010
Сообщений: 10
07.10.2010, 13:47     Для чего нужен EOF? #1
задание такое:написать программу, печатающую все вводимые символы в верхнем регистре, в строку выодится 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), о каком файле здесь идет речь?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2010, 13:47     Для чего нужен EOF?
Посмотрите здесь:

Для чего нужен define? C++
C++ для чего нужен символ \b
Прототип функции.Для чего нужен C++
Для чего нужен С/С++ и как ним пользоваться? C++
Для чего нужен с++? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.10.2010, 13:59     Для чего нужен EOF? #2
End of File это не только файл, как может показаться не первый взгляд.
В компьютерной терминологии end-of-file (конец файла) или просто EOF, является индикатором операционной системы означающим, что данные в источнике закончились. Источниками данных, обычно, являются файлы и потоки.
TheMachinist
 Аватар для TheMachinist
242 / 174 / 15
Регистрация: 14.06.2010
Сообщений: 422
07.10.2010, 14:01     Для чего нужен EOF? #3
может кто нибудь обьяснить для чего здесь нужен EOF (end of file),
Не нужен он тут особо , возьми и организуй цикл по другому


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

Добавлено через 12 минут
ещё можно так написать
C++
1
2
3
while (ch = cin.get()) != EOF) {
бла бла бла;
}
но для этого <cstdio> нужен
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.10.2010, 15:23     Для чего нужен EOF? #5
zikker, ios::eof и EOF совершенно разные вещи, не стоит их мешать и уж тем более не факт, что это должно работать.
zikker
 Аватар для zikker
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
07.10.2010, 17:33     Для чего нужен EOF? #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). Хотя могу и ошибаться.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
08.10.2010, 03:34     Для чего нужен EOF? #7
C++
1
while (cin.is_good())
ошибка чтения вроде не выставляет eof флаг, is_good может не вариант, но eof точно не вариант
zikker
 Аватар для zikker
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
08.10.2010, 13:04     Для чего нужен EOF? #8
Цитата Сообщение от accept Посмотреть сообщение
шибка чтения вроде не выставляет eof флаг
Я не это имел ввиду просто cin.eof свидетельствует о прекращение ввода и
while (ch = cin.get()) != EOF)
по сути эквивалентно
while (!cin.eof())
ch = cin.get();

Цитата Сообщение от accept Посмотреть сообщение
но eof точно не вариант
мой пример вроде как и работает(если не прав то поправьте ибо школота).
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
08.10.2010, 14:29     Для чего нужен EOF? #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 - нет никаких ошибок.

Поправьте, если не прав.
zikker
 Аватар для zikker
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
08.10.2010, 18:48     Для чего нужен EOF? #10
Цитата Сообщение от fasked Посмотреть сообщение
eofbit - конец потока/файла.
как я и говорил.
Цитата Сообщение от zikker Посмотреть сообщение
!cin.eof() нужно чтобы прекратить цикл при прекращение ввода
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
09.10.2010, 13:25     Для чего нужен EOF? #11
Цитата Сообщение от zikker Посмотреть сообщение
мой пример вроде как и работает
Он только eofbit проверяет. А если cin - файл с другого компа или с флешки, а сеть отключилась и флешку вынули, eofbit'а не будет. Будет badbit.
zikker
 Аватар для zikker
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
09.10.2010, 14:39     Для чего нужен EOF? #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)).
StUser
10 / 10 / 1
Регистрация: 09.10.2010
Сообщений: 23
09.10.2010, 14:53     Для чего нужен EOF? #13
В cin может и файл загоняться: myprog.exe < my.text
Ну и как выше написали сработает на Ctrl-Z или Ctrl-D в зависимости от системы, если вводить руками.
zikker
 Аватар для zikker
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
09.10.2010, 16:41     Для чего нужен EOF? #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 функционирует ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.10.2010, 16:58     Для чего нужен EOF? #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;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.10.2010, 06:19     Для чего нужен EOF? #16
Цитата Сообщение от zikker
как я это понял имелся ввиду именно ввод из консоли а не считывание файла или сокета
ошибка может и в консоли произойти (не прямо вот в окне, а в том источнике, куда кладутся символы, пока они не прочитаны), в таком случае cin.eof() никогда не наступит и цикл, отслеживающий это дело, повиснет
zikker
 Аватар для zikker
2 / 2 / 0
Регистрация: 06.10.2010
Сообщений: 39
10.10.2010, 16:05     Для чего нужен EOF? #17
Цитата Сообщение от accept Посмотреть сообщение
ошибка может и в консоли произойти
А кто говорит(печатает) про ошибки ?
Вопрос зачем .eof()
Ответ для определения конца ввода
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.10.2010, 02:22     Для чего нужен EOF? #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, не было ли в нём ошибки
потому что оно могло прочитать поток до половины, а потом выйти, потому что дальше не читается
komunisten
0 / 0 / 0
Регистрация: 10.09.2010
Сообщений: 10
13.10.2010, 16:58  [ТС]     Для чего нужен EOF? #19
ладно, а можно цикл организовать не используя eof? можете написать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2010, 03:25     Для чего нужен EOF?
Еще ссылки по теме:

C++ Для чего нужен шаблон <typename T>
Объясните для чего нужен конструктор C++
C++ Виртуальный деструктор, для чего нужен?

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2010, 03:25     Для чего нужен EOF? #20
C++
1
2
3
4
5
6
7
8
9
    while (cin.get(ch))
        cout << toupper(ch)
             << " | "
             << hex
             << ch
             << " | "
             << oct
             << ch
             << endl;
Yandex
Объявления
14.10.2010, 03:25     Для чего нужен EOF?
Ответ Создать тему
Опции темы

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