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

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

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

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

06.09.2011, 15:10. Просмотров 1783. Ответов 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

Подскажите, пожалуйста, почему не считывает последнюю цифру. В книге вроде как все должно быть в порядке...
0
Миниатюры
Пока ввод успешен и не достигнут EOF...  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2011, 15:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пока ввод успешен и не достигнут EOF... (C++):

Ввод данных пока строка не пустая - C++
Задача такая: Создать класс билет, который содержит поля:фамилия, номер рейса, и вводить данные пока строка с фамилией не пустая. Я...

Вводить пятизначное число пока не будет введено правильноеповторять ввод, пока не будет введено пятизначное число. Не получается выполнить задание. - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;rus&quot;); cout &lt;&lt; &quot;\t\t\tДеление числа на разряды.&quot;...

Ввод с клавиатуры n чисел, пока их сумма не превысит 10, а количество 6. - C++
Подскажите пожалуйста, как решить задачку на &quot;do while&quot;! Ввод с клавиатуры n чисел до тех пор, пока их сумма не превысит 10, а количество...

Как считывать слова/цифры пока не закончился ввод пользователем - C++
Как считывать слова/цифры пока не закончился ввод пользователем

Как зациклить ввод пока не будет введено одно из обрабатываемых значений? - C++
Как сделать что бы если else (введено не 1 или 2) вывело текст &quot;неправильный выбор&quot; и начало цикл заново? for (int i = 0; i &lt; 1; i++) ...

Ввод произвольных символов до тех пор, пока не будет введен символ q - C++
Написать программу ввода произвольных символов до тех пор, пока не будет введен символ q.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:00 #16
Я говорил, что буфер будет пуст после открытия перед первым чтением. Зачем его в этот момент синхронизировать? Он и так синхронизирован с файловым курсором.
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:01 #17
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, а при чём тут флаги ошибок потоков?
- вижу что не уловил мысли - установили флаг синхронизации в потоке и пользуемся синхронизированным потоком, можно это сделать после 1-го прочитанного символа, если до цикла вера не возволяет
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:03 #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
установили флаг синхронизации в потоке и пользуемся синхронизированным потоком, можно это сделать после 1-го прочитанного символа, если до цикла вера не возволяет
что вам это даст? ifstream сам знает, когда ему буферизировать ввод
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:12 #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
1
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:15 #20
-=ЮрА=-, вообще-то я уже исправил во втором посте, там нужно было две строчки поменять...

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

Добавлено через 30 секунд
У меня второй пост идёт...
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:23 #23
Я не обманываю c inFile.good() цикл while имеет 1-ну итерацию, думаю тут всё таки компиляторы замешаны
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:24 #24
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
06.09.2011, 17:29 #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 Посмотреть сообщение
Вот так работает:
Сколько выдает сумму?
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:29 #26
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
- у меня 6-ка(98 -года), ну так уж вышло что на работе новей ничего нету
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:32 #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 и не мучайтесь)

0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
06.09.2011, 17:34 #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;
    }
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:42 #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++; } );
0
grizlik78
Эксперт С++
1911 / 1443 / 112
Регистрация: 29.05.2011
Сообщений: 3,001
06.09.2011, 17:50 #30
Можно. Но широко использовать лямбды, по мне — рановато. С функтором получится громоздко. Ну и в процессе чтения может потребоваться производить много другой работы, которую трудно впихнуть в функтор. В общем программист вполне может выбрать, использовать ли цикл или алгоритм.
Но проверять состояние потока до ввода, не проверяя после — смысла мало. Так что написать правильный ввод с good() можно, но потребуется if() break и бесконечный цикл, что не слишком хорошо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 17:50
Привет! Вот еще темы с ответами:

Ввод чисел с клавиатуры до тех пор, пока не будет введена цифра 1 (цикл do) - C++
Используя оператор цикла do, составить программу, которая будет требовать ввод чисел с клавиатуры до тех пор, пока не будет введена цифра 1.

Ввод троек чисел и печать максимального до тех пор, пока пользователь продолжает процесс - C++
Ребята, опять обращаюсь за помощью! Пожалуйста, не судите строго, был всего один урок по функциям, а в голове еще даже матрица толком не...

Написать программу ввода произвольных чисел, принимающую ввод до тех пор, пока не будет введён ноль (циклы) - C++
Помогите решить задачу. Условие: Написать программу ввода произвольных чисел до тех пор, пока не будет введено число 0. Выводить сообщение...

Написать программу, вычисляющую сумму элементов. Ввод элементов продолжается до тех пор, пока не будет введен - C++
Написать программу, вычисляющую сумму элементов. Ввод элементов продолжается до тех пор, пока не будет введен символ &quot;n&quot;. помогите...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.09.2011, 17:50
Ответ Создать тему
Опции темы

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