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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
06.09.2011, 15:10     Пока ввод успешен и не достигнут EOF... #1
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++ Ввод произвольных символов до тех пор, пока не будет введен символ q
Ввод с клавиатуры n чисел, пока их сумма не превысит 10, а количество 6. C++
C++ Как считывать слова/цифры пока не закончился ввод пользователем
Как зациклить ввод пока не будет введено одно из обрабатываемых значений? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 15:59     Пока ввод успешен и не достигнут EOF... #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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:00     Пока ввод успешен и не достигнут EOF... #3
Цитата Сообщение от talis Посмотреть сообщение
while(inFile.good())
Чуть не забыл перед чтением нужно
C++
1
inFile.sync()
- поставь перед while
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:04     Пока ввод успешен и не достигнут EOF... #4
-=ЮрА=-, не существует функции std::ifstream::flush()

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

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

Добавлено через 1 минуту
Это полезно, когда после ввода числа вы хотите удалить из буфера ввода символ новой строки перед вводом строки. А так просто - не имеет смысла
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:15     Пока ввод успешен и не достигнут EOF... #7
Цитата Сообщение от talis Посмотреть сообщение
А смысл - мы из него ничего ещё не читали, зачем удалять-то?
Запиши вот так и почувствуй зачем sync писать
C++
1
2
inFile.sync();
    while (inFile.good())
Теперь светиться 18 символов
Миниатюры
Пока ввод успешен и не достигнут EOF...  
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:18     Пока ввод успешен и не достигнут EOF... #8
-=ЮрА=-, вот верите - добавил, ничего не изменилось. Как читались все 12 символов, так и читаются.
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:19     Пока ввод успешен и не достигнут EOF... #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, работаю с кодом ТС, а вы?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:21     Пока ввод успешен и не достигнут EOF... #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, работаю с кодом ТС, а вы?
Так точно, с кодом ТС и с файлом ТС.
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 16:30     Пока ввод успешен и не достигнут EOF... #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;
    }
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 16:33     Пока ввод успешен и не достигнут EOF... #12
-=ЮрА=-, сделайте так:

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

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

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

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

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:15     Пока ввод успешен и не достигнут EOF... #20
-=ЮрА=-, вообще-то я уже исправил во втором посте, там нужно было две строчки поменять...

Добавлено через 35 секунд
26-я и 29-я в исправленном варианте
Yandex
Объявления
06.09.2011, 17:15     Пока ввод успешен и не достигнут EOF...
Ответ Создать тему
Опции темы

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