Как я могу узнать, сколько байт sscanf s прочитал в своей последней операции?


Я написал класс быстрого чтения памяти, который эмулирует те же функции, что и fread и fscanf.

В основном, я использовал memcpy и увеличил внутренний указатель для чтения данных, таких как fread, но у меня есть вызов fscanf_s. Я использовал sscanf_s, но это не говорит мне, сколько байт он прочитал из данных.

Есть ли способ определить, сколько байт sscanf_s прочитано в последней операции, чтобы увеличить внутренний указатель считывателя строк? Спасибо!

Правка:

И пример формата, который я читаю:: |172|44|40|128|32|28|

Fscanf читает это прекрасно, так же как и sscanf. Единственная причина заключается в том, что, если бы это было:

|0|0|0|0|0|0|

Длина была бы другой. Мне интересно, как fscanf знает, куда поместить указатель файла, а sscanf-нет.

3 2

3 ответа:

Может, я и глуп, но все равно попробую. Судя по комментариям, это все еще какое-то неправильное представление. Вам нужно знать количество байт. Но метод возвращает только количество прочитанных полей, или EOF.

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

sscanf_s(source, "%d%d"...) 

Будет успешным на обоих входах "123 456 "и" 10\t30", которые имеют разную длину. В этих случаях невозможно определить размер, если только вы не преобразуете его обратно. Итак: используйте поле фиксированного размера или оставайтесь в забвении....

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

Редактировать:
Из "C++ The Complete Reference" я только что прочитал, что:

%n получает целое значение, равное этот номер считываемых символов до сих пор

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

С scanf и family, используйте %n в строке формата. Он ничего не будет читать, но это приведет к тому, что количество символов, прочитанных до сих пор (этим вызовом), будет сохранено в соответствующем параметре (ожидает int*).

От MSDN:

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l  

Каждая из этих функций возвращает количество полей, успешно преобразованных и назначенных; возвращаемое значение не включает поля, которые были прочитаны, но не были назначены. Возвращаемое значение 0 означает, что поля не были назначены. Возвращаемое значение-EOF для ошибки или если конец строки достигнут до первого преобразования.