Какая разница между чтением, чтением, get и getline?

В чем разница между этими функциями. Когда я их использую, все они делают то же самое. Например, все три вызова возвращают "hello":

#include <iostream>
#include <sstream>

int main()
{
    stringstream ss("hello");
    char x[10] = {0};
    ss.read(x, sizeof(x));          // #1
    std::cout << x << std::endl;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.readsome(x, sizeof(x));      // #2
    std::cout << x << std::endl;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.get(x, sizeof(x));           // #3
    std::cout << x;
    ss.clear();
    ss.seekg(0, ss.beg);
    ss.getline(x, sizeof(x));       // #4
    std::cout << x << std:endl;
}

Ответ 1

get и getline весьма схожи, когда get вызывается с параметрами ( char_type* s, std::streamsize count ). Однако get читается из потока до тех пор, пока не будет найден разделитель, а затем оставит его там. getline сравним, вытащите разделитель из потока, но затем отбросьте его. Он не будет добавлен в буфер, который он заполняет.

get ищет \n, и когда в аргументе указано определенное количество символов (например, count), перед остановкой он будет читать символы count - 1. read будет вытягивать все count из них.

Вы могли бы предусмотреть read как подходящее действие для двоичного источника данных, считывая определенное количество байтов. get будет более уместным в текстовом потоке, когда вы читаете строку, которую хотите прекратить с нулевым символом, и где такие вещи, как символы новой строки, имеют полезные синтаксические значения, разделяющие текст.

readsome возвращает только символы, которые сразу доступны в базовом буфере, что немного туманно и специфично для реализации. Это, вероятно, включает в себя символы, возвращенные в поток, используя putback, например. Тот факт, что вы не видите разницы между read и readsome, просто показывает, что они могут совместно использовать реализацию для конкретного типа потока и библиотеки, которую вы используете.

Ответ 2

Я наблюдал разницу между read() и readsome() в системе подачи флэш-памяти.

В базовом потоке считываются 8k-блоки, а метод read переходит к следующему блоку, чтобы удовлетворить вызывающего абонента, тогда как метод readsome разрешается возвращать меньше, чем запрос, чтобы не тратить время на выбор следующего блока.

Ответ 3

Основное различие между get() и getline() заключается в том, что get() оставляет символ новой строки во входном потоке, делая его первым символом, видимым следующей операцией ввода, тогда как getline() извлекает и отбрасывает символ новой строки из входного потока.