Pregunta

Por algunas razones, necesito un puntero a un archivo (FILE*) que apunta a nada.Significa que puedo pasar a la función fprintf y fprintf ignorar el puntero de archivo.

por ejemplo:

void my_function()
{
  FILE* nothing = NULL; // NULL is not correct.
  int n = fprintf(nothing, "PI = %f", 3.14); // Note: When nothing = NULL, error ocured.
}

Hay un puntero a un archivo (FILE*) que apunta a la nada?

¿Fue útil?

Solución

No.

Su código provocará una excepción en tiempo de ejecución.Puede usar /dev/null, por ejemplo, si está ejecutando un sistema operativo que lo admite, pero no hay nada como eso integrado en C ++.

Otros consejos

Para resolver su problema real (que se indica en los comentarios), el uso de snprintf en lugar de printf, siempre que está disponible en su implementación en C++ (que no está garantizado en C++03).Pasar un puntero nulo para el búfer y 0 para el tamaño.No hay nada escrito, pero el valor de retorno es la longitud de la cadena con formato (excluyendo nulo terminador).

[Editar:uy, me olvidé de que snprintf en Windows no se ajustan a C99.Devuelve un error si se produce un truncamiento, no la longitud requerida.No sé lo que vamos a hacer sobre el hecho de que C++0x requiere C99-conforme snprintf.]

Para responder a su pregunta, usted puede fopen /dev/null en sistemas tipo UNIX, o nul en Windows.Escribe el resultado FILE* no tienen ningún efecto.Sin embargo, no hay ningún portátil null-dispositivo.

¿por qué no envolver el fprintf llamada al método con una if (NULL != nothing) declaración?

Aunque como NirMH dijo, puede encerrar en if (nothing != NULL), hay otra manera.De que pueda abrir un archivo en modo de lectura (con "r") y cuando lo envía a fprintf, la escritura es ignorado (Editar:como se discute en los comentarios, recuerda poner n=0 si es negativa como devuelto por fprintf).

Personalmente, sugiero que el primer método, aunque.La única razón por la que podría hacer la segunda es si no puedo cambiar la función.

Si a usted no le importa si su código es dependiente del sistema, puede utilizar /dev/null en linux, nul en windows etc,

estás haciendo un error de diseño.

Obviamente, lo que quiere saber es el número de caracteres necesarios para escribir su número.

Usted está usando _ * printf_ para eso, lo cual es una buena idea. Solo quieres calcular el número de caracteres "escritos", por lo tanto, se necesita. Pero no desea que se muestre nada, por lo que pinchó FPRINTF en lugar de solo printf . Pero fprintf no funciona sin un archivo para escribir en ...

Como dijo Steve, debe preferir usar snprintf () que escribe en una cadena en la memoria.

Como dice Steve, SNPRINTF proporcionado con una cadena nula debe funcionar según lo previsto, excepto en Windows. Luego, en Windows, simplemente proporcione una cadena temporal que se descarte después.

size_t computeNumCharsNeededToPrintMyStuff(double d)
{
    size_t ret = 0;
    size_t maxBuffSize = 100; // should be plenty enough

    char *tmpBuff = new char[maxBuffSize ];
    ret = snprintf(tmpBuff, maxBuffSize, "PI = %f", d);
    delete[] tmpBuff;

    return ret;
}

entonces solo llamas:

n = computeNumCharsNeededToPrintMyStuff(3.14)

(esta FUNC podría mejorarse para calcular el tamaño necesario para mostrar cualquier cosa, pero prefiero mantenerlo simple por ahora.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top