Чтение ввода из потока строк
Я читаю ввод в массив символов размера 5,
stringstream ss;
char a[5];
if (!ss.read(a, 5))
{
// throw exception
}
if (!ss.get(a, 5))
{
// throw exception
}
Кажется, обе эти функции работают, есть ли разница?
4 ответа
ss.read
будет читать 5 байтов из потока, если он не достигнет конца потока.
ss.get
будет читать 4 байта, если только он не достигнет разделителя ('\n') или конца потока. Это также приведет к нулевому завершению строки.
Первый будет читать 5 байтов, останавливаясь рано только при обнаружении EOF.
Последний будет читать 4 байта (оставляя место для нулевого завершения), останавливаясь рано при встрече с EOF или при встрече '\n'
,
Какой из них вы хотите, зависит от того, намерены ли вы a
вести себя семантически как C-строка.
http://www.cplusplus.com/reference/iostream/istream/read/ http://www.cplusplus.com/reference/iostream/istream/get/
Чтение - это когда вам нужны блоки данных (например: ss.read( a, 2)) - это не сохраняет его как c-строку и не завершается нулем.
Get - извлекает символы из потока и сохраняет их в виде c-строки в массив, начинающийся с ss. Выполнение останавливается, если есть символы-разделители, такие как \n.
ss.get дает вам неформатированные данные, ss.read - блок, оба унаследованы от ссылки istream.