2010-07-23 3 views
2

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

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

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

EDIT:

И пример формата Я читаю это: |172|44|40|128|32|28|

fscanf читает, что хорошо, так что делает sscanf. Единственная причина в том, что, если бы это было быть:

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

длина будет отличаться. Мне интересно, как fscanf знает, куда помещать указатель файла, но sscanf этого не делает.

+0

(после редактирования) Я думаю, вам нужно '% n' – Abel

+0

возможно дублировать [Получить количество символов, прочитанных sscanf?] (Http://stackoverflow.com/questions/13503135/get-number-of-characters -read-by-sscanf) – sevko

ответ

2

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

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

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

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

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

EDIT:
С "C++ Полный справочник" Я только что прочитал, что:

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

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

+0

Подходит для вашего редактирования, тестирования и работы отлично. Я принял твое, потому что знаю, что ты первым ответил на это. Еще раз спасибо! – Gbps

+0

@Gbps: приветствуется, на этот раз не стоит? ;-). PS, вот ссылка MSDN того же '% n1', если кто-то его пропустил http://msdn.microsoft.com/en-us/library/6ttkkkhh%28v=VS.80%29.aspx – Abel

0

From MSDN:

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l 

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

+0

Но что, если вы читали% d,% d,% d? Там нет спецификатора, как долго каждый из этих чисел находится в строковой форме. – Gbps

+0

Если вы хотите быть точным, используйте массив символов, как в 'char * buffer = new char [80];' и укажите размер: 'sscanf_s (anysource,"% s ", buffer, 80);'. Отсюда: http://www.gamedev.net/community/forums/topic.asp?topic_id=393967 – Abel

+0

Это количество полей! В вопросе задано «количество байтов». – Patrick

6

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

Смежные вопросы