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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
#1

Пока ввод успешен и не достигнут EOF... - C++

06.09.2011, 15:10. Просмотров 1763. Ответов 35
Метки нет (Все метки)

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <fstream>
#include <cstdlib>// poddergka exit()
 
    const int SIZE = 60;
    
int main()
{
    setlocale(LC_ALL, "rus");
    
    char filename[SIZE];
    std::ifstream inFile;
    std::cout << "Ââåäèòå èìÿ ГґГ*éëГ*: ";
    std::cin.getline(filename,SIZE);
    inFile.open(filename);//Г*ññîöèðîâГ*ГІГј inFile Г± ГґГ*éëîì
    
    if (!inFile.is_open()){//Г*ГҐ ГіГ¤Г*ëîñü îòêðûòü ГґГ*éë
    std::cout << "ГЌГҐ Г¤Г*ëîñü îòêðûòü ГґГ*éë " << filename << std::endl;
    std::cout << "ÏðîãðГ*ììГ* ïðåðâГ*Г*Г*.\n";
    system ("PAUSE");
    exit (EXIT_FAILURE);}
    
    double value;
    double sum =0.0;
    int count = 0;
    inFile >> value;
    
    while (inFile.good()){ // ïîêГ* ââîä ГіГ±ГЇГҐГёГҐГ* ГЁ Г*ГҐ äîñòèãГ*ГіГІ EOF?
    ++count;
    sum += value;
    inFile >> value;}
    
    if (inFile.eof())
    std::cout << "ÄîñòèãГ*ГіГІ ГЄГ®Г*ГҐГ¶ ГґГ*éëГ*.\n";
    else if (inFile.fail())
    std::cout << "Ââîä ïðåêðГ*Г№ГҐГ* ГЁГ§-Г§Г* Г*ГҐ ñîîòâåòñòâèÿ Г¤Г*Г*Г*ûõ.\n";
    else
    std::cout << "Ââîä ïðåêðГ*Г№ГҐГ* ГЇГ® Г*åèçâåñòГ*îé ïðè÷èГ*ГҐ.\n";
    
    if (count == 0)
    std::cout << "Г„Г*Г*Г*ûõ Г*ГҐГІ.\n";
    else {
         std::cout << "Ïðî÷èòГ*Г*Г® ýëåìåГ*òîâ: " << count << std::endl;
         std::cout << "ÑóììГ*: " << sum << std::endl;
         std::cout << "ÑðåäГ*ГҐГҐ: " << sum/count << std::endl;}
         
    inFile.close();
        
    
    std::cout << "\n\n\n";
    system("PAUSE");
    return 0;
}
carinfo.txt :
18 19 18.5 13.5 14 16 19.5 20 18 12 18.5 17.5

Подскажите, пожалуйста, почему не считывает последнюю цифру. В книге вроде как все должно быть в порядке...
Миниатюры
Пока ввод успешен и не достигнут EOF...  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2011, 15:10     Пока ввод успешен и не достигнут EOF...
Посмотрите здесь:
Ввод данных пока строка не пустая C++
C++ Вводить пятизначное число пока не будет введено правильноеповторять ввод, пока не будет введено пятизначное число. Не получается выполнить задание.
Ввод с клавиатуры n чисел, пока их сумма не превысит 10, а количество 6. C++
C++ Как считывать слова/цифры пока не закончился ввод пользователем
C++ Ввод произвольных символов до тех пор, пока не будет введен символ q
Как зациклить ввод пока не будет введено одно из обрабатываемых значений? C++
Ввод чисел с клавиатуры до тех пор, пока не будет введена цифра 1 (цикл do) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:00     Пока ввод успешен и не достигнут EOF... #16
Я говорил, что буфер будет пуст после открытия перед первым чтением. Зачем его в этот момент синхронизировать? Он и так синхронизирован с файловым курсором.
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:01     Пока ввод успешен и не достигнут EOF... #17
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, а при чём тут флаги ошибок потоков?
- вижу что не уловил мысли - установили флаг синхронизации в потоке и пользуемся синхронизированным потоком, можно это сделать после 1-го прочитанного символа, если до цикла вера не возволяет
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:03     Пока ввод успешен и не достигнут EOF... #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
установили флаг синхронизации в потоке и пользуемся синхронизированным потоком, можно это сделать после 1-го прочитанного символа, если до цикла вера не возволяет
что вам это даст? ifstream сам знает, когда ему буферизировать ввод
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:12     Пока ввод успешен и не достигнут EOF... #19
Вобщем я понял где собака зарыта, думал проверка inFile.eof в цикле, а там вообще другое

Вот подправленный код и результат работы

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
double value;
    double sum =0.0;
    int count = 0;
    
    inFile.sync();
    while (!inFile.eof())
    { 
        // пока ввод успешен и не достигнут EOF?
        inFile>>value;
        sum += value;
        count++;        
    }
    
    if (inFile.eof())
    std::cout << "Достигнут конец файла.\n";
    else 
        if (inFile.fail())
            std::cout << "Ввод прекращен из-за не соответствия данных.\n";
        else
            std::cout << "Ввод прекращен по неизвестной причине.\n";
    
    if (count == 0)
        std::cout << "Данных нет.\n";
    else 
    {
             std::cout << "Прочитано элементов: " << count << std::endl;
             std::cout << "Сумма: " << sum << std::endl;
             std::cout << "Среднее: " << sum/count << std::endl;
    }  
    inFile.close();
Введите имя файла: carinfo.txt
Достигнут конец файла.
Прочитано элементов: 12
Сумма: 204.5
Среднее: 17.0417
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:15     Пока ввод успешен и не достигнут EOF... #20
-=ЮрА=-, вообще-то я уже исправил во втором посте, там нужно было две строчки поменять...

Добавлено через 35 секунд
26-я и 29-я в исправленном варианте
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:21     Пока ввод успешен и не достигнут EOF... #21
Добавлено через 1 минуту
talis , как раз твой 2-й пост у меня не идёт в цикле проверка !inFile.eof() должна быть!
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:22     Пока ввод успешен и не достигнут EOF... #22
А если конец файла не достигнут, но произошла ошибка формата?

Добавлено через 30 секунд
У меня второй пост идёт...
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:23     Пока ввод успешен и не достигнут EOF... #23
Я не обманываю c inFile.good() цикл while имеет 1-ну итерацию, думаю тут всё таки компиляторы замешаны
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:24     Пока ввод успешен и не достигнут EOF... #24
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.09.2011, 17:29     Пока ввод успешен и не достигнут EOF... #25
Цитата Сообщение от talis Посмотреть сообщение
KeyGen, проверьте - он не считывает первую цифру. Причина тому - вот этот участок кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    double value;
    double sum =0.0;
    int count = 0;
    inFile >> value;
 
   while (inFile.good())  // пока ввод успешен и не достигнут EOF?
    {
        ++count;
        sum += value;
        inFile >> value;
 
        /*std::cout << value << ' ';*/ // проверка
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    double value;
    double sum =0.0;
    int count = 0;
    inFile >> value; // вот здесь считывается первое число
 
   while (inFile.good())  // пока ввод успешен и не достигнут EOF?
    {
        ++count;
        sum += value;
        inFile >> value;
 
        /*std::cout << value << ' ';*/ // проверка
    }
Цитата Сообщение от talis Посмотреть сообщение
Вот так работает:
Сколько выдает сумму?
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:29     Пока ввод успешен и не достигнут EOF... #26
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
- у меня 6-ка(98 -года), ну так уж вышло что на работе новей ничего нету
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:32     Пока ввод успешен и не достигнут EOF... #27
Цитата Сообщение от kazak Посмотреть сообщение
Сколько выдает сумму?
да, тогда так:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    double value = 0.0;
    double sum =0.0;
    int count = 0;
    //inFile >> value;
 
   while (inFile.good())  // пока ввод успешен и не достигнут EOF?
    {
        inFile >> value;
        ++count;
        sum += value;
        /*inFile >> value; - считать ПЕРЕД суммированием */
 
        /*std::cout << value << ' ';*/ // проверка
    }
И, между прочим, код ТС действительно не читал первую цифру

Добавлено через 31 секунду

Не по теме:

-=ЮрА=-, скачайте Dev-C++ или Code::Blocks и не мучайтесь)

grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
06.09.2011, 17:34     Пока ввод успешен и не достигнут EOF... #28
К сожалению, правильный вариант ввода вообще не использует функцию .good(), хотя, возможно, ТС и надо было использовать обязательно её.
C++
1
2
3
4
5
6
7
8
    double value;
    double sum = 0.0;
    int count = 0;
    
    while (inFile >> value){ // пока ввод успешен и не достигнут EOF
        ++count;
        sum += value;
    }
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:42     Пока ввод успешен и не достигнут EOF... #29
grizlik78, ну давайте вообще всё это безобразие заменим этим:

C++
1
2
3
double sum = 0.0;
int count = 0;
std::for_each( std::istream_iterator<double> ( inFile ), std::istream_iterator<double> (), [&](double d){ sum += d; count++; } );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 17:50     Пока ввод успешен и не достигнут EOF...
Еще ссылки по теме:
C++ Ввод троек чисел и печать максимального до тех пор, пока пользователь продолжает процесс
Написать программу ввода произвольных чисел, принимающую ввод до тех пор, пока не будет введён ноль (циклы) C++
Написать программу, вычисляющую сумму элементов. Ввод элементов продолжается до тех пор, пока не будет введен C++
C++ Определить сотрудников, которым в следующем году достигнут пенсионного возраста (выводится только 1 сотрудник)
Возводить в степень пока пока a < b C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
06.09.2011, 17:50     Пока ввод успешен и не достигнут EOF... #30
Можно. Но широко использовать лямбды, по мне — рановато. С функтором получится громоздко. Ну и в процессе чтения может потребоваться производить много другой работы, которую трудно впихнуть в функтор. В общем программист вполне может выбрать, использовать ли цикл или алгоритм.
Но проверять состояние потока до ввода, не проверяя после — смысла мало. Так что написать правильный ввод с good() можно, но потребуется if() break и бесконечный цикл, что не слишком хорошо.
Yandex
Объявления
06.09.2011, 17:50     Пока ввод успешен и не достигнут EOF...
Ответ Создать тему
Опции темы

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