Sunday, November 20, 2016

Freopen Stdout Binary Options

La respuesta simple es no. El modo se determina cuando se construye el objeto iostream y no se puede cambiar posteriormente. Algunas implementaciones pueden proporcionar un medio de hacerlo más adelante, pero esto no está estandarizado. En algunas implementaciones, hacer un freopen en stdout podría cambiar el modo, aunque creo que formalmente, esto está prohibido en C. (Es la implementación definida en C.) Y al parecer, no funciona en su implementación. Lo mejor es averiguar cómo su sistema nombra el dispositivo de consola (/ dev / tty bajo UNIX CONS. Creo, bajo Windows), abrirlo en el modo deseado y enviarlo a él. Respondió Apr 16 14 at 11: 34 Según POSIX (ver sección de uso de la aplicación), freopen fue agregado originalmente a C para facilitar el cambio de stdin y stdout al modo binario. Sospecho que si usted cava a través de los documentos de la justificación de ANSI / ISO usted puede encontrar la ayuda para esa declaración. Como documentos POSIX, este uso es inútil en los sistemas POSIX (donde se requiere que el texto y el modo binario se comporten de forma idéntica) y realmente perjudicial debido a un error en la especificación que conduce al truncamiento del archivo si se sigue estrictamente. En cuanto a los usos prácticos, aquí hay algunos que puedo pensar en: reemplazar stdin. Stdout Y stderr antes de ejecutar programas externos - pero no está claro para mí si POSIX requiere freopen para reutilizar el mismo número de descriptor de archivo que el archivo original tenía o no, así que Im no estoy seguro de que esto está garantizado para trabajar. Siempre uso open y dup2 para este propósito. Una biblioteca de registro que toma un archivo de la persona que llama puede utilizar freopen para ponerlo en el modo de anexar para asegurar que todos los datos se escriben al final incluso si otro programa escribe en el archivo de registro. Si youve ya pasó alrededor y los punteros FILE almacenados a una serie de componentes en su programa y usted se encuentra más tarde la necesidad de apoyar intercambiando el archivo (por ejemplo, la rotación de registro viene a la mente), freopen es mucho más fácil que rastrear por todas partes el ARCHIVO fue almacenado y hackear en código para actualizar cada instancia o envolver el archivo en su propia estructura que le permite intercambiarlo. La utilidad de todo esto está limitada por el mal comportamiento o freopen en caso de falla el archivo se vuelve inválido e irrecuperable, por lo que si alguna parte del programa todavía puede estar utilizando, usted tiene que encontrar una manera de impedir el acceso o salir de inmediato. Del mismo modo, freopen no es thread-safe por la misma razón si falla, el acceso al archivo de cualquier otro hilo resulta en un comportamiento indefinido. Respondió Nov 12 10 at 22:37 No - freopen () no es redundante. Le permite abrir un archivo como entrada estándar, por ejemplo, que de lo contrario no podía confiar en lograr. Si usted tiene que llamar a una función (para la cual usted no tiene el código fuente, por lo que no puede arreglarlo) que lee en un flujo de archivo en particular (típicamente entrada estándar) o escribe en un flujo de archivo en particular Quiere que la función de leer o escribir en el archivo que está conectado allí en su programa, a continuación, puede utilizar freopen () para arreglar las cosas para que la función ve lo que espera, pero obtiene la información desde donde desea - o lo escribe donde usted quiere. Vovanium: si puedes especificar el flujo porque el código llamado utiliza fprintf () en el flujo que lo entregas, en lugar de printf (). Entonces no hay razón para usar freopen (). En 25 años de programación en C, no creo que use freopen () más de un par de veces, si eso. Como R. señaló, si desea hacer cosas como restablecer la salida estándar de nuevo a su archivo original después de que la redirección esté completa, abandona el ámbito del estándar C en territorio POSIX y utiliza descriptores de archivo. Por ejemplo, fdopen () crea una secuencia para un descriptor de archivo que he usado con bastante frecuencia. Ndash Jonathan Leffler Nov 12 10 a las 23: 01freopen (3) - Página del manual de Linux fopen, fdopen, freopen - abre funciones en abierto Sinopsis Requisito Requisitos de macros de prueba para glibc (ver featuretestmacros (7)): fdopen (): POSIXCSOURCE gt 1 XOPENSOURCE POSIXSOURCE Descripción La función fopen () abre el archivo cuyo nombre es la cadena apuntada por path y asocia una secuencia con ella. El modo de argumento apunta a una cadena que comienza con una de las siguientes secuencias (posiblemente seguida por caracteres adicionales, como se describe a continuación): r Abra el archivo de texto para leerlo. El flujo se coloca al principio del archivo. Abierto para leer y escribir. El flujo se coloca al principio del archivo. Truncar el archivo a longitud cero o crear un archivo de texto para escribir. El flujo se coloca al principio del archivo. Abierto para leer y escribir. El archivo se crea si no existe, de lo contrario se trunca. El flujo se coloca al principio del archivo. Abrir para añadir (escribir al final del archivo). El archivo se crea si no existe. El flujo se coloca al final del archivo. Abrir para leer y agregar (escribir al final del archivo). El archivo se crea si no existe. La posición inicial del archivo para la lectura está al principio del archivo, pero la salida siempre se anexa al final del archivo. La cadena de modo también puede incluir la letra b como último carácter o como un carácter entre los caracteres de cualquiera de las cadenas de dos caracteres descritas anteriormente. Esto es estrictamente para la compatibilidad con C89 y no tiene ningún efecto el b se ignora en todos los sistemas conformes POSIX, incluyendo Linux. (Otros sistemas pueden tratar archivos de texto y archivos binarios de forma diferente, y agregar el b puede ser una buena idea si hace E / S a un archivo binario y espera que su programa puede ser portado a entornos no UNIX). Detalles de las extensiones glibc para el modo. Cualquier archivo creado tendrá el modo SIRUSR SIWUSR SIRGRP SIWGRP SIROTH SIWOTH (0666), modificado por el valor umask de los procesos (ver umask (2)). Las lecturas y escrituras pueden mezclarse en los flujos de lectura / escritura en cualquier orden. Tenga en cuenta que ANSI C requiere que una función de posicionamiento de archivos intervenga entre la salida y la entrada, a menos que una operación de entrada se encuentre al final del archivo. (Si esta condición no se cumple, entonces se le permite a una lectura devolver el resultado de escrituras que no sean las más recientes.) Por lo tanto, es una buena práctica (ya veces incluso necesaria bajo Linux) poner un fseek (3) o fgetpos (3 ) Entre operaciones de escritura y lectura en dicho flujo. Esta operación puede ser una aparente no-op (como en fseek (.0L, SEEKCUR) llamado para su efecto secundario de sincronización. Abrir un archivo en modo de anexar (a como el primer carácter de modo) hace que todas las operaciones de escritura posteriores a este flujo a La función fdopen () asocia una secuencia con el descriptor de archivo existente, fd. El modo de la secuencia (uno de los valores r, r, w, w, a, A) debe ser compatible con el modo del descriptor de archivo El indicador de posición de archivo de la nueva secuencia se fija en la que pertenece a fd y los indicadores de error y de final de archivo se borran Los modos w o w no causan truncamiento Del archivo El descriptor de archivo no se engaña y se cerrará cuando se cierre el flujo creado por fdopen () El resultado de aplicar fdopen () a un objeto de memoria compartida no está definido La función freopen () abre el archivo cuyo Name es la cadena apuntada por path y asocia la secuencia apuntada por stream con ella. La secuencia original (si existe) se cierra. El argumento mode se utiliza como en la función fopen (). El uso principal de la función freopen () es cambiar el archivo asociado con un flujo de texto estándar (stderr. Stdin o stdout). Valor de retorno Al finalizar con éxito fopen (), fdopen () y freopen () devuelven un puntero FILE. De lo contrario, se devuelve NULL y errno se establece para indicar el error. Errores El modo proporcionado a fopen (), fdopen () o freopen () no es válido. Las funciones fopen (), fdopen () y freopen () también pueden fallar y establecer errno para cualquiera de los errores especificados para la rutina malloc (3). La función fopen () también puede fallar y establecer errno para cualquiera de los errores especificados para la rutina abierta (2). La función fdopen () también puede fallar y establecer errno para cualquiera de los errores especificados para la rutina fcntl (2). La función freopen () también puede fallar y establecer errno para cualquiera de los errores especificados para las rutinas open (2), fclose (3) y fflush (3). Conforming To Las funciones fopen () y freopen () se ajustan a C89. La función fdopen () cumple con POSIX.1-1990. Notas Notas de Glibc La biblioteca de GNU C permite las siguientes extensiones para la cadena especificada en modo. C (desde glibc 2.3.3) No realice la operación de apertura, o subsecuentes operaciones de lectura y escritura, los puntos de cancelación de hilo. Este indicador se ignora para fdopen (). E (desde glibc 2.7) Abra el archivo con el indicador OCLOEXEC. Consulte open (2) para obtener más información. Este indicador se ignora para fdopen (). M (desde glibc 2.3) Intenta acceder al archivo usando mmap (2), en lugar de llamadas al sistema de E / S (read (2), write (2)). En la actualidad, el uso de mmap (2) sólo se intenta para un archivo abierto para la lectura. X Abra el archivo exclusivamente (como el indicador OEXCL de open (2)). Si el archivo ya existe, fopen () falla y establece errno en EEXIST. Este indicador se ignora para fdopen (). Además de los caracteres anteriores, fopen () y freopen () soportan la siguiente sintaxis en modo. La cadena dada se toma como el nombre de un conjunto de caracteres codificados y el flujo se marca como ancho-orientado. A partir de entonces, las funciones de conversión interna convierten E / S en y desde la serie de caracteres. Si no se especifica la sintaxis de cadenas ccs, la orientación amplia del flujo se determina mediante la primera operación de archivo. Si esa operación es una operación de carácter ancho, el flujo se marca con una orientación amplia y se cargan las funciones para convertirlas al conjunto de caracteres codificado. Bugs Cuando se analiza para caracteres de bandera individuales en modo (es decir, los caracteres que preceden a la especificación ccs), la implementación glibc de fopen () y freopen () limita el número de caracteres examinados en modo a 7 (o, en glibc antes de 2.14, a 6, que no era suficiente para incluir posibles especificaciones tales como rbcmxe). La implementación actual de fdopen () analiza como máximo 5 caracteres en modo. Ver también Referenced By


No comments:

Post a Comment