Как я могу узнать, сколько байт 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 ответа:
Может, я и глуп, но все равно попробую. Судя по комментариям, это все еще какое-то неправильное представление. Вам нужно знать количество байт. Но метод возвращает только количество прочитанных полей, или EOF.
Чтобы получить количество байт, либо используйте что-то, что вы можете легко подсчитать, либо используйте спецификатор размера в строке формата. В противном случае у вас не будет шанса узнать, сколько байт считывается, кроме того, что вы просматриваете поля один за другим. Кроме того, что вы может означать, что
sscanf_s(source, "%d%d"...)
Будет успешным на обоих входах "123 456 "и" 10\t30", которые имеют разную длину. В этих случаях невозможно определить размер, если только вы не преобразуете его обратно. Итак: используйте поле фиксированного размера или оставайтесь в забвении....
Важное примечание: помните, что при использовании
%c
это единственный способ включить разделители полей (новую строку, табуляцию и пробел) в выходные данные. Все остальные будут пропускать границы поля, что затруднит поиск нужного количества байты.Редактировать:
Из "C++ The Complete Reference" я только что прочитал, что:
%n
получает целое значение, равное этот номер считываемых символов до сих порРазве это не именно то, что вы были после? Просто добавьте его в строку формата. Это подтверждено здесь , но я не проверял его с помощью sscanf_s.
С
scanf
и family, используйте%n
в строке формата. Он ничего не будет читать, но это приведет к тому, что количество символов, прочитанных до сих пор (этим вызовом), будет сохранено в соответствующем параметре (ожидаетint*
).
sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l
Каждая из этих функций возвращает количество полей, успешно преобразованных и назначенных; возвращаемое значение не включает поля, которые были прочитаны, но не были назначены. Возвращаемое значение 0 означает, что поля не были назначены. Возвращаемое значение-EOF для ошибки или если конец строки достигнут до первого преобразования.