2014-11-24 3 views
5

Это все равно, что readsome даже не читает. Возвращает 0 и не читает никаких символов. Что здесь не так?C++ std :: istream readsome ничего не читает

#include <fstream> 
#include <iostream> 

int main() 
{ 
    std::fstream stream("list.cpp", std::ios::in); 

    if (stream.good() || !stream.bad() || stream.is_open()) { 

    std::cout << "Well, stream looks good." << std::endl; 

    char justOneChar = 'L'; 
    auto ssize = stream.readsome(&justOneChar, 1); 

    std::cout << ssize << " : " << justOneChar << std::endl; 
    } 

    return -1; 
} 

Выход:

Ну, поток выглядит хорошо. 0: L

ответ

4
auto ssize = stream.readsome(&justOneChar, 1); 

1 является максимального количества символов для чтения. Если внутренние буферы потоков пусты, когда вы его вызываете, вы получите beck zero в качестве возвращаемого значения.

Следующая цитата (с моим жирным шрифтом) показывает этот аспект:

streamsize readsome (char* s, streamsize n);

Экстракты до n символов из потока и сохраняет их в массиве, на который указывает s, останавливаясь как только внутренний буфер, хранящийся связанным потоковым буфером (если есть), исчерпывает символы, даже если конец файла еще не достигнут.

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

Это в основном способ получить как можно больше символов (с учетом указанного вами ограничения), не дожидаясь, пока поток предоставит больше.

7

Консалтинг a reference,

Поведение этой функции является весьма конкретной реализации. Например, при использовании с std::ifstream некоторые реализации библиотеки заполняют базовые filebuf данными, как только файл открывается (и readsome() на таких реализациях считывает данные, потенциально, но необязательно, весь файл), тогда как другие реализации, файл, когда запрашивается фактическая операция ввода (и readsome(), выданная после открытия файла, никогда не извлекает никаких символов). Аналогично, вызов std::cin.readsome() может возвращать весь ожидающий необработанный ввод в консоль или всегда может возвращать ноль и не извлекать никаких символов.

Короче говоря, readsome довольно бесполезен, по крайней мере, для стандартных потоков. Это супер-неблокируемое чтение: оно будет загружать только данные, которые были буферизованы в процессе пользовательского уровня, и он никогда не вызовет ядро.

1

Это не работает, потому что в этот момент не могут быть доступны какие-либо символы для чтения. Он работает как неблокирующая функция чтения, как кто-то упоминал, поэтому это означает, что он не ждет ввода, поэтому он не просил вас вводить данные. Поэтому, чтобы вы могли использовать его для успешного чтения, в базовом буфере должно быть что-то доступное.

Чтобы увидеть количество символов, которое может быть извлечено при следующем вызове readsome, используйте функцию in_avail.

+2

'in_avail' избегает возврата нуля, так что он не может надежно сказать вам, что никакие символы не будут возвращены' readsome'. – Potatoswatter