Я думаю, что-то вроде этого должно работать, я использовал класс istringstream
для преобразования возрастов в целые числа с проверкой ошибок на случай, если это не сработает.
int x,age;
int total=0;
int nofpeople=0;
int average=0;
string check;
cout<<"Enter the ages and when you're done write 'OK'." << endl;
while(check!="OK")
{
string temp;
cin>>temp;
istringstream iss(temp);
iss >> x;
if(x>0)
{
age=x;
nofpeople++;
total=total+age;
average=total/nofpeople;
}
else if (temp.compare("OK") == 0)
{
check="OK";
}
else
{
cerr << "Invalid or negative number entered" << endl;
}
}
cout<<"Number of people you have entered=" << nofpeople << endl;
cout<<"Sum of ages=" << total<< endl;
cout<<"Average of ages=" <<average;
return 0;
Для общего InputStream я перенес бы его в BufferedInputStream и сделал бы что-то вроде этого:
BufferedInputStream bis = new BufferedInputStream(inputStream);
bis.mark(2);
int byte1 = bis.read();
int byte2 = bis.read();
bis.reset();
// note: you must continue using the BufferedInputStream instead of the inputStream
Вы могли бы найти, что PushbackInputStream был полезен:
http://docs.oracle.com/javase/6/docs/api/java/io/PushbackInputStream.html
Когда использование BufferedInputStream удостоверяется, что inputStream уже не буферизуется, двойная буферизация заставит некоторых серьезно трудно находить ошибки. Также необходимо обработать Читателей по-другому, преобразовав в StreamReader, и Буферизация заставит байты быть потерянными, если Читатель будет Буферизован. Также, если Вы используете Читателя, помнят, что Вы не читаете байты, но символы в кодировке по умолчанию (если явное кодирование не было установлено). Примером буферизированного входного потока, который Вы не можете знать, является URL URL; url.openStream ();
у меня нет ссылок для этой информации, она прибывает из отладки кода. Основной случай, где проблема произошла для меня, был в коде, которые читают из файла в сжатый поток. Если я помню правильно, после того как Вы начинаете отлаживать через код существуют комментарии в источнике Java, что определенные вещи не работают правильно всегда. Я не помню, куда информация от использования BufferedReader и BufferedInputStream прибывает из, но я думаю что сбои немедленно даже на самом простом тесте. Не забудьте тестировать это, необходимо отмечать больше, чем размер буфера (который отличается для BufferedReader по сравнению с BufferedInputStream), проблемы происходят когда байты, считанные досягаемость конец буфера. Примечание там является размером буфера исходного кода, который может отличаться от размера буфера, который Вы устанавливаете в конструкторе. Это некоторое время, так как я сделал это так, мои воспоминания о деталях могут быть немного выключены. Тестирование было сделано с помощью FilterReader/FilterInputStream, добавьте тот к прямому потоку и один к буферизированному потоку для наблюдения различия.
Я нашел реализацию PeekableInputStream здесь:
http://www.heatonresearch.com/articles/147/page2.html
идея реализации, показанной в статье, состоит в том, что это сохраняет массив "посмотревших" значений внутренне. При вызове чтения значения возвращены сначала от посмотревшего массива, затем от входного потока. При вызове быстрого взгляда значения читаются и хранятся в "посмотревшем" массиве.
, Поскольку лицензия примера кода является LGPL, Это может быть присоединено к этому сообщению:
package com.heatonresearch.httprecipes.html;
import java.io.*;
/**
* The Heaton Research Spider Copyright 2007 by Heaton
* Research, Inc.
*
* HTTP Programming Recipes for Java ISBN: 0-9773206-6-9
* http://www.heatonresearch.com/articles/series/16/
*
* PeekableInputStream: This is a special input stream that
* allows the program to peek one or more characters ahead
* in the file.
*
* This class is released under the:
* GNU Lesser General Public License (LGPL)
* http://www.gnu.org/copyleft/lesser.html
*
* @author Jeff Heaton
* @version 1.1
*/
public class PeekableInputStream extends InputStream
{
/**
* The underlying stream.
*/
private InputStream stream;
/**
* Bytes that have been peeked at.
*/
private byte peekBytes[];
/**
* How many bytes have been peeked at.
*/
private int peekLength;
/**
* The constructor accepts an InputStream to setup the
* object.
*
* @param is
* The InputStream to parse.
*/
public PeekableInputStream(InputStream is)
{
this.stream = is;
this.peekBytes = new byte[10];
this.peekLength = 0;
}
/**
* Peek at the next character from the stream.
*
* @return The next character.
* @throws IOException
* If an I/O exception occurs.
*/
public int peek() throws IOException
{
return peek(0);
}
/**
* Peek at a specified depth.
*
* @param depth
* The depth to check.
* @return The character peeked at.
* @throws IOException
* If an I/O exception occurs.
*/
public int peek(int depth) throws IOException
{
// does the size of the peek buffer need to be extended?
if (this.peekBytes.length <= depth)
{
byte temp[] = new byte[depth + 10];
for (int i = 0; i < this.peekBytes.length; i++)
{
temp[i] = this.peekBytes[i];
}
this.peekBytes = temp;
}
// does more data need to be read?
if (depth >= this.peekLength)
{
int offset = this.peekLength;
int length = (depth - this.peekLength) + 1;
int lengthRead = this.stream.read(this.peekBytes, offset, length);
if (lengthRead == -1)
{
return -1;
}
this.peekLength = depth + 1;
}
return this.peekBytes[depth];
}
/*
* Read a single byte from the stream. @throws IOException
* If an I/O exception occurs. @return The character that
* was read from the stream.
*/
@Override
public int read() throws IOException
{
if (this.peekLength == 0)
{
return this.stream.read();
}
int result = this.peekBytes[0];
this.peekLength--;
for (int i = 0; i < this.peekLength; i++)
{
this.peekBytes[i] = this.peekBytes[i + 1];
}
return result;
}
}