Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
#1

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

06.09.2011, 15:10. Просмотров 1951. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

Как зациклить ввод пока не будет введено одно из обрабатываемых значений?
Как сделать что бы если else (введено не 1 или 2) вывело текст &quot;неправильный...

35
-=ЮрА=-
Заблокирован
Автор FAQ
06.09.2011, 17:21 #21
Добавлено через 1 минуту
talis , как раз твой 2-й пост у меня не идёт в цикле проверка !inFile.eof() должна быть!
0
talis
793 / 545 / 61
Регистрация: 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
793 / 545 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:24 #24
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 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
793 / 545 / 61
Регистрация: 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
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
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
793 / 545 / 61
Регистрация: 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
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
06.09.2011, 17:50 #30
Можно. Но широко использовать лямбды, по мне — рановато. С функтором получится громоздко. Ну и в процессе чтения может потребоваться производить много другой работы, которую трудно впихнуть в функтор. В общем программист вполне может выбрать, использовать ли цикл или алгоритм.
Но проверять состояние потока до ввода, не проверяя после — смысла мало. Так что написать правильный ввод с good() можно, но потребуется if() break и бесконечный цикл, что не слишком хорошо.
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
06.09.2011, 17:55 #31
KeyGen, кстати, добавь после последнего числа пробел или перевод строки, и твой вариант заработает как надо.

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

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

Не по теме:

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



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

Не по теме:

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

1
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
06.09.2011, 18:42  [ТС] #33
А что это за фишка inFile.sync();? В чем собака порыта? )
0
talis
793 / 545 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:43 #34
KeyGen, http://www.cplusplus.com/reference/iostream/istream/sync/
1
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
06.09.2011, 18:53  [ТС] #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;
}
0
talis
793 / 545 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:54 #36
KeyGen, отлично на английском сайте написано. В этой теме я уже переводил.
1
06.09.2011, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 18:54

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

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

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


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Опции темы

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