std :: ifstream :: read или std :: ofstream :: write с нулевым параметром?

Это нормально (= четко определенное поведение в соответствии со стандартом) для вызова:

mystream.read(buffer, 0);

или же

mystream.write(buffer, 0);

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

6

Решение

Да, поведение четко определено: обе функции пройдут через движения для неформатированных функций ввода / вывода (построение часового механизма, установка битов сбоя, если установлен eofbit, очистка связанного потока, если необходимо), и затем они попадут в это предложение :

§27.7.2.3 [istream.unformatted] / 30

Символы извлекаются и сохраняются до тех пор, пока не произойдет одно из следующих действий:

— сохранено n символов;

§27.7.3.7 [ostream.unformatted] / 5

Символы вставляются, пока не произойдет одно из следующих действий

— вставлено n символов;

«Ноль символов хранится / вставляется» — это истина, прежде чем что-либо будет сохранено или извлечено.

Глядя на реальные реализации, я вижу for (; gcount < n; ++gcount) в libc ++ или же sgetn(buffer, n); в stdlibc ++ который имеет эквивалентный цикл

8

Другие решения

Еще одно извлечение из 27.7.2.3 Unformatted input functions/1 дает нам подсказку, что входные буферы нулевого размера являются допустимым регистром:

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

0

По вопросам рекламы [email protected]