Есть ли указатель на файл (FILE *), который ни на что не указывает?
-
29-10-2019 - |
Вопрос
По некоторым причинам мне нужен указатель файла (FILE *), который ни на что не указывает.Это означает, что я могу передать его функции fprintf, а fprintf игнорировать указатель файла.
например:
родовое словоЕсть ли указатель на файл (FILE *), который ни на что не указывает?
Решение
Нет.
Ваш код вызовет исключение во время выполнения.Вы можете использовать, например, /dev/null
, если вы работаете в поддерживающей его ОС, но в C ++ нет ничего подобного встроенному.
Другие советы
Чтобы решить вашу актуальную проблему (указанную в комментариях), используйте snprintf
вместо printf
при условии, что он доступен в вашей реализации C ++ (что не гарантируется в C ++ 03).Передайте нулевой указатель для буфера и 0 для размера.Ничего не записывается, но возвращаемое значение - это длина форматированной строки (исключая нулевой терминатор).
[Edit: ой, я забыл, что код генерируемого кода в Windows не соответствует C99.Он возвращает ошибку, если происходит усечение, а не требуемая длина.Я не знаю, что они собираются делать с тем фактом, что C ++ 0x требует snprintf
, соответствующего C99.]
Чтобы ответить на ваш вопрос, вы можете открыть snprintf
в UNIX-подобных системах или /dev/null
в Windows.Запись в результирующий кодовый кодовый код не имеет никакого эффекта.Однако портативного нулевого устройства не существует.
Почему не упаковывать метод FPRINTF Call с оператором if (NULL != nothing)
?
Хотя, как сказал NirMH, вы можете заключить его в if (nothing != NULL)
, есть и другой способ.Вы можете открыть файл в режиме чтения (с помощью "r"
), и когда вы отправляете его в fprintf
, запись игнорируется (Edit: как обсуждалось в комментариях, не забудьте установить n=0
, если он был отрицательным, как возвращено fprintf
).
Я лично предлагаю первый способ.Единственная причина, по которой я могу сделать второе, - это то, что я не могу изменить функцию.
Если вам все равно, зависит ли ваш код от системы, вы можете использовать /dev/null
в Linux, nul
в Windows и т. д.
Вы ошиблись в дизайне.
Очевидно, что вы хотите знать, сколько символов необходимо для написания вашего числа.
Для этого вы используете _ * printf_, и это хорошая идея. Вы просто хотите вычислить количество «написанных» символов, следовательно, необходимых. Но вы не хотите, чтобы что-либо отображалось, поэтому вы выбрали fprintf вместо просто printf . Но fprintf не работает без ФАЙЛА для записи ...
Как сказал Стив, вам лучше использовать snprintf () , который записывает в строку в памяти.
Как говорит Стив, snprintf , снабженный строкой NULL, должен работать, как задумано, за исключением окон. Затем в Windows просто укажите временную строку, которую вы потом отбросите.
родовое словоТогда просто позвоните:
родовое слово(Эта функция может быть расширена для вычисления размера, необходимого для отображения чего-либо, но я бы предпочел пока не усложнять.)