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

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

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

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

06.09.2011, 15:10. Просмотров 1691. Ответов 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++ Ввод произвольных символов до тех пор, пока не будет введен символ q
Ввод с клавиатуры n чисел, пока их сумма не превысит 10, а количество 6. C++
C++ Как считывать слова/цифры пока не закончился ввод пользователем
Как зациклить ввод пока не будет введено одно из обрабатываемых значений? C++
C++ Ввод троек чисел и печать максимального до тех пор, пока пользователь продолжает процесс
Написать программу, вычисляющую сумму элементов. Ввод элементов продолжается до тех пор, пока не будет введен C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор 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
3031 / 2352 / 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
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
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++; } );
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
06.09.2011, 17:50     Пока ввод успешен и не достигнут EOF... #30
Можно. Но широко использовать лямбды, по мне — рановато. С функтором получится громоздко. Ну и в процессе чтения может потребоваться производить много другой работы, которую трудно впихнуть в функтор. В общем программист вполне может выбрать, использовать ли цикл или алгоритм.
Но проверять состояние потока до ввода, не проверяя после — смысла мало. Так что написать правильный ввод с good() можно, но потребуется if() break и бесконечный цикл, что не слишком хорошо.
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.09.2011, 17:55     Пока ввод успешен и не достигнут EOF... #31
KeyGen, кстати, добавь после последнего числа пробел или перевод строки, и твой вариант заработает как надо.

Добавлено через 1 минуту
Цитата Сообщение от talis Посмотреть сообщение
C++
1
2
3
4
5
6
while (inFile.good()) // пока ввод успешен и не достигнут EOF?
 {
   inFile >> value;
   ++count;
   sum += value;
 }
А этот вариант с пробелом на конце будет выдавать лишнее число
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
06.09.2011, 17:58     Пока ввод успешен и не достигнут EOF... #32
Цитата Сообщение от kazak Посмотреть сообщение
KeyGen, кстати, добавь после последнего числа пробел или перевод строки, и твой вариант заработает как надо.
Но в этом случае перестанет работать последний вариант talis

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

Не по теме:

Опоздал. Эх...



Добавлено через 1 минуту

Не по теме:

И да, я не имел в виду вариант с алгоритмом.

KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
06.09.2011, 18:42  [ТС]     Пока ввод успешен и не достигнут EOF... #33
А что это за фишка inFile.sync();? В чем собака порыта? )
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:43     Пока ввод успешен и не достигнут EOF... #34
KeyGen, http://www.cplusplus.com/reference/i.../istream/sync/
KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
06.09.2011, 18:53  [ТС]     Пока ввод успешен и не достигнут EOF... #35
talis,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// read a file into memory
#include <iostream>
using namespace std;
 
int main () {
  char first, second;
 
  cout << "Please, enter a word: ";
  first=cin.get();
  cin.get(); //работает по англ не очень понятно на сайте
  //cin.sync(); функция похожа?
 
  cout << "Please, enter another word: ";
  second=cin.get();
 
  cout << "The first word began by " << first << endl;
  cout << "The second word began by " << second << endl;
 
 
  system("PAUSE");
  return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 18:54     Пока ввод успешен и не достигнут EOF...
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:54     Пока ввод успешен и не достигнут EOF... #36
KeyGen, отлично на английском сайте написано. В этой теме я уже переводил.
Yandex
Объявления
06.09.2011, 18:54     Пока ввод успешен и не достигнут EOF...
Ответ Создать тему
Опции темы

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