Чтение ввода из потока строк

Я читаю ввод в массив символов размера 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.

Другие вопросы по тегам