387 / 294 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
1

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

06.09.2011, 15:10. Показов 4386. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2011, 15:10
Ответы с готовыми решениями:

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

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

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

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

35
Заблокирован
Автор FAQ
06.09.2011, 17:21 21
Author24 — интернет-сервис помощи студентам
Добавлено через 1 минуту
talis , как раз твой 2-й пост у меня не идёт в цикле проверка !inFile.eof() должна быть!
0
794 / 546 / 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
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 17:24 24
-=ЮрА=-, верю. Я тоже не обманываю. GCC 4.6
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,167
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
794 / 546 / 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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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
794 / 546 / 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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
06.09.2011, 17:50 30
Можно. Но широко использовать лямбды, по мне — рановато. С функтором получится громоздко. Ну и в процессе чтения может потребоваться производить много другой работы, которую трудно впихнуть в функтор. В общем программист вполне может выбрать, использовать ли цикл или алгоритм.
Но проверять состояние потока до ввода, не проверяя после — смысла мало. Так что написать правильный ввод с good() можно, но потребуется if() break и бесконечный цикл, что не слишком хорошо.
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,167
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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
06.09.2011, 17:58 32
Цитата Сообщение от kazak Посмотреть сообщение
KeyGen, кстати, добавь после последнего числа пробел или перевод строки, и твой вариант заработает как надо.
Но в этом случае перестанет работать последний вариант talis

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

Не по теме:

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



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

Не по теме:

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

1
387 / 294 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
06.09.2011, 18:42  [ТС] 33
А что это за фишка inFile.sync();? В чем собака порыта? )
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:43 34
KeyGen, http://www.cplusplus.com/refer... ream/sync/
1
387 / 294 / 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
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
06.09.2011, 18:54 36
KeyGen, отлично на английском сайте написано. В этой теме я уже переводил.
1
06.09.2011, 18:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2011, 18:54
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru