CreateFile
vs fopen
vs ofsteam
- ventaja & desventaja?CreateFile vs fopen vs ofsteam ventaja y desventaja?
Escuché que CreateFile es poderoso pero solo para Windows.
¿Puede decirme qué debería usar (en Windows) y por qué?
CreateFile
vs fopen
vs ofsteam
- ventaja & desventaja?CreateFile vs fopen vs ofsteam ventaja y desventaja?
Escuché que CreateFile es poderoso pero solo para Windows.
¿Puede decirme qué debería usar (en Windows) y por qué?
Depende de lo que esté haciendo. Para leer y escribir secuencialmente archivos de texto, iostream es definitivamente el camino a seguir. Para cualquier cosa que implique seguridad transaccional o dispositivos no estándar, tendrá que acceder al sistema directamente (CreateFile
o open
). Incluso entonces, para la lectura secuencial y la escritura de texto, la mejor solución es definir su propio streambuf
, y usarlo con iostream.
No puedo pensar en ningún contexto en el que sea preferible fopen
.
En la mayoría de los casos, será mejor utilizar fopen en C o ofstream en C++. CreateFile ofrece cierto control adicional sobre el uso compartido y el almacenamiento en caché, pero no brinda funcionalidad de formateo.
Así que escribe un 'streambuf' que usa' CreateFile' de la manera que necesita usarlo, y obtiene las ventajas de ambos. –
Siempre me he preguntado por qué es tan engorroso enchufar una nueva fuente o destino en IOstreams. En todo caso, C++ hace que sea fácil declarar una clase abstracta pura para un escritor/lector de datos ... –
A menos que necesite las características proporcionadas por las funciones de archivos de Windows (por ejemplo, que se superponen/O), entonces mi sugerencia va, ya sea con iostreams en C++ o FILE
(fopen
y amigos) en C.
Además de ser más portátil , también puede usar entrada/salida formateada para archivos de texto, y para C++ es fácil sobrecargar los operadores de salida/entrada para sus clases.
También es fácil derivar de 'std :: streambuf' y para algunas de las características" especiales "(integridad transaccional, dispositivos especiales) , etc.) –
A menos que absoulutely necesita la funcionalidad adicional proporcionada por las funciones de la API del sistema operativo (como CreateFile
) me recomendaría el uso de las funciones de la librería estándar (como fopen
o ofstream
). De esta manera, su programa será más portátil.
La única ventaja real de utilizar CreateFile
que puedo pensar es E/S solapada y quizás derechos de acceso más finos.
Si desea utilizar archivos de Windows mapeo de memoria se debe utilizar CreateFile
(por ejemplo, la HANDLE
pasado a CreateFileMapping API es el valor de retorno de CreateFile
). Además, CreateFile
ofrece mayores opciones de personalización que la API de archivo estándar C y C++.
Sin embargo, si desea escribir código portable, o si no necesita características específicas de Windows, las API de archivo estándar C y C++ están bien. En algunas pruebas, al procesar datos de gran tamaño, noté cierta sobrecarga de rendimiento de flujos de E/S de C++ vs. API de archivos en C sin formato; si te encuentras en casos como este, simplemente puedes ajustar la API de archivo C sin procesar en alguna clase C++ RAII, y aún así usarla en código C++.
Necesito grandes archivos de datos de 4GB a 10GB + y el mapeo de mem también lo usaré. – Eveler
Por lo tanto, si necesita mapeo de memoria puede usar llamadas directas a la API Win32 y envolverlas en clases C++ RAII. –
copié mi respuesta de
fopen or CreateFile in Windows
que estaba cerrado por alguna razón, que se me escapa ...
Conclusiones:
No tengas miedo de estas pequeñas tareas. En realidad sabrá qué está sucediendo en su código y estos pequeños fragmentos de código deberían ser insignificantes (en cantidad de líneas de código) en comparación con el código que lo llama. Además, si usa RAII para todo, el código que invoca estas clases de utilidad será considerablemente menor en comparación con cuando no se usa RAII y teniendo que usar dos o incluso más pasos de inicialización y mucho menos propenso a errores.Reemplazar estas clases de utilidad con clases de utilidad equivalentes para otro SO también es un juego de niños (usando open()/close()/read()/write() en UNIX).
Y por el bien de los milenios anteriores, ¡no lea las pautas de programación de google!
Quiero poder :) escribir y leer binario. solo para sistemas de Windows. Como escuché abrir y fopen no coincidir con createfile, esto es cierto? – Eveler
@Eveler: si quieres plena potencia, lo más rápido que puedes hacer para procesar un archivo es abrirlo con 'CreateFile' y asignarlo a la memoria con' CreateFileMapping', como se ilustra en [esta publicación del blog] (http: //blogs.msdn.com/b/oldnewthing/archive/2005/05/13/417183.aspx), que es parte de una serie de optimización que comienza desde [estándar C++] (http://blogs.msdn.com/ b/oldnewthing/archive/2005/05/10/415991.aspx) y luego se mueve progresivamente a [Win32 optimized code] (http://blogs.msdn.com/b/oldnewthing/archive/2005/05/19/420038 .aspx). Pero en la mayoría de los casos, los estándares simples C y C++ están bien. –
'fopen' es una función de nivel superior, reemplazada por' fstream :: open' en C++. 'CreateFile' y' open' son funciones de nivel de sistema, la primera en Windows, la segunda en Unix. No ofrecen exactamente lo mismo, ya que los sistemas admiten diferentes características de forma diferente. –