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

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

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

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

06.09.2011, 15:10. Просмотров 1780. Ответов 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, 15:59 #2
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
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
54
55
56
57
58
59
60
61
62
#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 = 0; /* Инициализация value нулём */
    double sum = 0.0;
    int count = 0;
    /*inFile >> value; - это тут лишнее */
 
    while (inFile.good())  // пока ввод успешен и не достигнут EOF?
    {
        ++count;
        sum += value;
        inFile >> value;
 
        std::cout << 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;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:00 #3
Цитата Сообщение от talis Посмотреть сообщение
while(inFile.good())
Чуть не забыл перед чтением нужно
C++
1
inFile.sync()
- поставь перед while
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:04 #4
-=ЮрА=-, не существует функции std::ifstream::flush()

Добавлено через 55 секунд
ибо flush синхронизирует буфер вывода с файлом вывода (то есть записывает все незаписанные символы в файл) в потоках вывода std::ostream и наследованных от них.
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:07 #5
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, не существует функции std::ifstream::flush()
Добавлено через 55 секунд
ибо flush синхронизирует буфер вывода с файлом вывода (то есть записывает все незаписанные символы в файл) в потоках вывода std::ostream и наследованных от них.
- я поправился, посмотри пост ещё раз
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:10 #6
посмотрел, но отправил я это до того, как вы нажали "применить"

inFile.sync() - это другое дело. std::ifstream::sync() есть, однако в этом вызове тут нет смысла. sync() синхронизирует буфер объекта потока с входным файлом, удаляя из буфера все символы, не взятые из этого буфера. А смысл - мы из него ничего ещё не читали, зачем удалять-то?

Добавлено через 1 минуту
Это полезно, когда после ввода числа вы хотите удалить из буфера ввода символ новой строки перед вводом строки. А так просто - не имеет смысла
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:15 #7
Цитата Сообщение от talis Посмотреть сообщение
А смысл - мы из него ничего ещё не читали, зачем удалять-то?
Запиши вот так и почувствуй зачем sync писать
C++
1
2
inFile.sync();
    while (inFile.good())
Теперь светиться 18 символов
0
Миниатюры
Пока ввод успешен и не достигнут EOF...  
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:18 #8
-=ЮрА=-, вот верите - добавил, ничего не изменилось. Как читались все 12 символов, так и читаются.
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:19 #9
Цитата Сообщение от talis Посмотреть сообщение
А так просто - не имеет смысла
- Имеет смысл http://www.cplusplus.com/reference/i...treambuf/sync/

Цитирую
It is called to synchronize the stream buffer with the controlled sequence (like the file in the case of file streams)

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
=ЮрА=-, вот верите - добавил, ничего не изменилось. Как читались все 12 символов, так и читаются.
- значит от компилятора зависит, проверял 6-кой

PS:talis, работаю с кодом ТС, а вы?
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:21 #10
Нет, не имеет

http://www.cplusplus.com/reference/i.../istream/sync/

Synchronizes the buffer associated with the stream to its controlled input sequence. This effectively means that the unread characters in the buffer are discarded.
Перевод:
Синхронизирует буфер, ассоциированный с потоком, с входной последовательностью, контролируемой этим потоком. Это означает, что все не прочтённые символы удаляются из буфера.

А мы ничего ещё не читали, символов в буфере нет

Добавлено через 29 секунд
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PS:talis, работаю с кодом ТС, а вы?
Так точно, с кодом ТС и с файлом ТС.
1
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:30 #11
Цитата Сообщение от talis Посмотреть сообщение
А мы ничего ещё не читали, символов в буфере нет
- т.е когда начали чтение в буфере нет символов
Предлагаю ТС проексперементировать а затем отписать в топик...

Добавлено через 1 минуту
KeyGen, предлагаю попробовать вот так сделать inFile.sync
C++
1
2
3
4
5
6
7
inFile.sync();
    while (inFile.good())
    { // пока ввод успешен и не достигнут EOF?
        ++count;
        sum += value;
        inFile >> value;
    }
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:33 #12
-=ЮрА=-, сделайте так:

C++
1
std::cout << "avilable characters: " << inFile.rdbuf()->in_avail() << '\n';
и посмотрите сами: в буфере нет символов.
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:58 #13
Цитата Сообщение от talis Посмотреть сообщение
и посмотрите сами: в буфере нет символов.
- sync - устанавливает флаг синхронизации который в последующем действует всё время пока этот флаг не снимут

Добавлено через 4 минуты
Аналогично есть флаги ошибок потоков которые можно сбрасывать,
http://chg.fatal.ru/misc/prog-cpp/prog_137.html

к этому и подводил - установили синхронизацию и в цикле всё норм...
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:59 #14
-=ЮрА=-, а при чём тут флаги ошибок потоков?
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:59 #15
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, сделайте так:
Код C++
1
std::cout << "avilable characters: " << inFile.rdbuf()->in_avail() << '\n';
- о буфере говорил когда чтение началось или он по прежнему будет пуст???)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 16:59
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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