Самый простой способ прочитать нулевую завершающую строку с помощью istream? - PullRequest
7 голосов
/ 14 марта 2011

У меня есть istream, и мне нужно прочитать точно определенное количество байтов, НО я не знаю его длину.Это нулевое окончание.Я думал, что мог бы либо: 1) написать цикл и прочитать по одному байту за раз 2) сказать ему, чтобы он возвращал мне буфер или строку, которая начинается сейчас до определенного байта (0 в данном случае).или 3) Читайте в буфере ровно один байт за раз, проверяйте его на 0 и добавляйте в строку, если это не так.

Третий, который я знаю, я могу сделать, но другие 2 звучат так, как это возможнос istream (в данном случае это файловый поток).Я все еще читаю документацию для istream.Theres много.

Ответы [ 3 ]

13 голосов
/ 14 марта 2011

Поскольку вы не знаете его длины, самое простое будет:

std::string strBuf;
std::getline( istream, strBuf, '\0' );
2 голосов
/ 14 марта 2011

Номер 2) возможно с использованием метода getline из istream:

std::istream is = ...;

const int MAX_BUFFSIZE = 512;
char buffer[MAX_BUFFSIZE];

is.getline(buffer, MAX_BUFFSIZE, '\0');    // Get up to MAX_BUFFSIZE - 1 bytes until the first null character (or end of stream)

Обратите внимание, что это удаляет разделитель (нулевой символ) из входного потока, но не добавляет его в буфер (в этом примере разница между getline() и get()). Тем не менее, нулевой символ автоматически добавляется в буфер; поэтому последний байт будет содержать нулевой символ, но он будет удален из потока.

1 голос
/ 14 марта 2011

Это похоже на перегрузку:

istream& get (char* s, streamsize n, char delim ); 

из http://www.cplusplus.com/reference/iostream/istream/get/ решит вашу проблему;положить '\0' как delim.Существует также версия (показана на http://www.cplusplus.com/reference/string/getline/), которая будет возвращать std::string.

...