Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1

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

06.09.2011, 15:10. Показов 5751. Ответов 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...  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2011, 15:10
Ответы с готовыми решениями:

Ввод, пока не достигнут конец ввода
Доброго времени суток. Нужно заполнить массив, пока не окончен ввод(кол-во элементов массива неизвестно) Как это сделать? Заранее спасибо ...

Переставлять элементы матрицы, пока не будет достигнут нужный результат
Задана квадратная матрица А(n,n), n&lt;=20. Разработать программу, которая перестановками рядков и столбов превращает эту матрицу так, чтобы...

Ввод EOF с клавиатуры
int c while((c=getchar())!=EOF) {операторы} программа будет выполнятся до окончания потока или символа конца строки. Enter - переводит...

35
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
06.09.2011, 17:21
Студворк — интернет-сервис помощи студентам
Добавлено через 1 минуту
talis , как раз твой 2-й пост у меня не идёт в цикле проверка !inFile.eof() должна быть!
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:22
А если конец файла не достигнут, но произошла ошибка формата?

Добавлено через 30 секунд
У меня второй пост идёт...
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
06.09.2011, 17:23
Я не обманываю c inFile.good() цикл while имеет 1-ну итерацию, думаю тут всё таки компиляторы замешаны
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:24
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
0
 Аватар для kazak
3606 / 2746 / 356
Регистрация: 11.03.2009
Сообщений: 6,318
06.09.2011, 17:29
Цитата Сообщение от 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
06.09.2011, 17:29
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
- у меня 6-ка(98 -года), ну так уж вышло что на работе новей ничего нету
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:32
Цитата Сообщение от 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
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
06.09.2011, 17:34
К сожалению, правильный вариант ввода вообще не использует функцию .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
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:42
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
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
06.09.2011, 17:50
Можно. Но широко использовать лямбды, по мне — рановато. С функтором получится громоздко. Ну и в процессе чтения может потребоваться производить много другой работы, которую трудно впихнуть в функтор. В общем программист вполне может выбрать, использовать ли цикл или алгоритм.
Но проверять состояние потока до ввода, не проверяя после — смысла мало. Так что написать правильный ввод с good() можно, но потребуется if() break и бесконечный цикл, что не слишком хорошо.
0
 Аватар для kazak
3606 / 2746 / 356
Регистрация: 11.03.2009
Сообщений: 6,318
06.09.2011, 17:55
KeyGen, кстати, добавь после последнего числа пробел или перевод строки, и твой вариант заработает как надо.

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

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

Не по теме:

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



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

Не по теме:

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

1
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
06.09.2011, 18:42  [ТС]
А что это за фишка inFile.sync();? В чем собака порыта? )
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:43
KeyGen, http://www.cplusplus.com/refer... ream/sync/
1
 Аватар для KeyGen
388 / 295 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
06.09.2011, 18:53  [ТС]
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
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:54
KeyGen, отлично на английском сайте написано. В этой теме я уже переводил.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.09.2011, 18:54

Ввод EOF в консоль на MAC
#include &lt;stdio.h&gt; /* копирование ввода на вывод */ int main () { int c; c = getchar (); while (c != EOF) { putchar...

Ввод с клавиатуры - требовать у пользователя ввод, пока он не будет корректным
Поискал в интернете и тут - не могу найти ответ на свой вопрос. Основная проблема - фильтровать введённые данные пользователя (введённые...

Ввод текста, поясните суть EOF
Задача: ввести несколько строк текста Ввод соответственно идёт через char cc; while ((cc=getchar())!=EOF) Так вот, как...

Напишите программу, в которой осуществляется ввод целых чисел, ввод осуществляется до тех пор пока не будет введен ноль
Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор пока не будет введен ноль)и подсчет суммы и...

Ввод символов, пока цифры
Программа вводит произвольную последовательность символов до тех пор, пока это цифры. Программа определяет сколько, раз встретилась цифра...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru