2013-06-10 5 views
0

Прошу прощения, что я беспокоюсь о С.О. с таким общим запросом информации.C99 - vscanf для чайников?

Я могу найти множество очень терминологических определений vscanf - но я не могу найти много примеров конкретного примера, который покажет, что возвращается из функции, кроме этого довольно приятного в IBM сайт инфоцентр:

http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fvscanf.htm

Однако этот пример только для ввода строки в одну строку, в то время как я пытаюсь сделать то же самое, но чтение из текстового файла с несколькими линиями.

Должен ли я использовать fgets() для чтения строки за раз, а затем использовать vscanf? Должен ли я использовать его внутри функции, как это делает пример Infocenter IBM, помещая его в функцию vread()?

Я студент-студент первого года обучения, но это не вопрос для задания, я просто пытаюсь сделать дополнительную работу и расширить свои знания, и пока нам еще не добрался/vscanf.

Должен ли я просто использовать sscanf? Приносим извинения, если это так глупо.

P.S. Мне нравится учиться C. Самое увлекательное, что у меня было в школе за 31 год на этой планете, кроме того, когда я однажды проводил мастерскую Шекспира с некоторыми людьми из RSC.

+1

Добро пожаловать в переполнение стека. Вскоре прочитайте [FAQ]. Функция 'vread()' не является частью C99 (или POSIX). Вы можете найти информацию о ['vscanf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/vscanf.html) на веб-сайте POSIX. Возвращаемое значение такое же, как для любой другой функции 'scanf()' family; количество успешных преобразований. –

+0

О, ладно, так что это просто работает как sscanf ... Спасибо за ссылку, но есть ли способ, которым вы можете немного потушить меня? Я предполагаю, что вы имеете в виду то же самое ", за исключением того, что вместо вызова с переменным числом аргументов они вызываются с помощью списка аргументов, как определено в заголовке ." –

+1

Если вы не знаете, как использовать списки аргументов переменной длины, в первую очередь, маловероятно, что вы должны пытаться использовать 'vfscanf()'. Я никогда не нуждался в нем только в течение 30 лет программирования C. Я знаю, как его использовать, но я никогда не был в таком положении, когда это имело смысл; действительно, я не уверен, что смогу разработать сценарий, где это имеет смысл.(Кстати, 'vread()' неизвестен Google.) Вы знаете, как использовать 'vfprintf()'? Вы знаете, как использовать 'fscanf()'? Синтез этих двух частей знаний в использование 'vscanf()' et al в основном прямолинейный. –

ответ

1

vscanf как scanf, а не sscanf или fscanf. Он отличается от scanf тем, что scanf принимает переменное количество аргументов, тогда как vscanf принимает аргумент va_list, который действует как указатель на список переменных аргументов. Использование vscanf встречается редко; это в основном для полноты (использование vprintf более распространено). Возможным примером использования vscanf является то, что если у вас было большое количество вызовов scanf с разными аргументами, и в каждом случае требуется некоторое действие с ошибкой - такое же действие с ошибкой - если scanf не может прочитать все свои аргументы. Затем вы можете написать функцию scanf_and_check_for_error, которая принимает переменные аргументы так же, как scanf, с добавлением аргумента count, который является ожидаемым возвращаемым значением scanf, передает список аргументов в vscanf, проверяет его возвращаемое значение и принимает действие с ошибкой, если возвращаемое значение неверно. например,

void scanf_and_check(int count, char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    int rc = vscanf(fmt, ap); 
    if (rc != count) 
    { 
     ErrorMessageBox("Bad input. This program employs a radical form of the fail-fast principle ... exiting!"); 
     exit(1); 
    } 
    va_end(ap); 
} 
+0

Это отличный ответ, спасибо. Определенно помогает мое понимание на vscanf() –

+0

как вызвать scanf_and_check рекурсивно внутри if-предложения? – MAKZ

0

Не будучи бесполезным, я подозреваю, что вы можете попробовать не тот инструмент для работы. vscanf предназначен для использования при разработке «front-end» для семейства scanf и является очень «низкоуровневым» инструментом.

Возможно, вы захотите использовать fscanf. Если вы действительно хотите использовать логику vscanf (со всеми ее уродством va_list), взгляните на vfscanf (связанный в вашем примере)

+0

Не бесполезно, сэр ... Как я и говорю, я ничего не знаю в принципе. На самом деле это очень полезная информация. Это помогает мне составить представление о том, что такое vscanf, хотя прямо сейчас я должен просто придерживаться fgets() и sscanf() или просто использовать fscanf() ... Я мог бы даже использовать fgetc(). –