Inicio > C++, Cómo hacer, WIN-32 > Cómo escribir datos en un archivo

Cómo escribir datos en un archivo


Para saber cómo abrir, crear y cerrar archivos, consulta la entrada sobre manipulación de archivos. Para saber cómo leer datos, consulta la entrada sobre leer datos desde archivos.

La contraparte de ReadFile es, como cabría esperar, WriteFile, cuyo prototipo es el siguiente:

BOOL WINAPI WriteFile(
 HANDLE hFile,
 LPCVOID lpBuffer,
 DWORD nNumberOfBytesToWrite,
 LPDWORD lpNumberOfBytesWritten,
 LPOVERLAPPED lpOverlapped
);

de donde:

  • hFile. El handle del archivo al cuál se escribirá. Dicho handle se obtiene al abrir (o crear) un archivo con CreateFile, y por supuesto, debe abrirse con permisos de escritura.
  • lpBuffer. Es la estructura binaria que contiene los bytes a escribir en el archivo.
  • nNumberOfBytesToWrite. Indica el número de bytes que se pretenden escribir. Usualmente, si se emplea un tipo de dato, será el tamaño de este (i.e. si escribiremos un int, entonces el valor de este parámetro sería sizeof(int)); si escribimos un búfer de caracteres, entonces sería el tamaño total de dicho búfer (i.e. si nuestro búfer es un char de 10 caracteres, entonces el valor del parámetro sería sizeof(char)*10)).
  • lpNumberOfBytesWritten. Un puntero a un DWORD que nos regresará el número de caracteres leídos (usualmente, será igual a nNumberOfBytesToWrite a menos que haya habido algún error, i.e. no había suficiente memoria). Si este dato no se necesita, puede ser NULL.
  • lpOverlapped. Un puntero a la estructura OVERLAPPED. Si nuestro archivo se abrió (o creó) con la bandera FILE_FLAG_OVERLAPPED, este parámetro nos regresa la información relacionada. Al ser opcional, puede ser un NULL. Eso del "overlapped" se emplea cuando escribimos un archivo de forma asíncrona (digamos, a un dispositivo USB, donde nos interesa que nuestra aplicación no espere a que se termine de pasar la información).
    Así las cosas, escribir datos es exageradamente sencillo. En el siguiente ejemplo, escribiremos unos tres números enteros.
    int main()
    {
      HANDLE hFile;
      int val1, val2, val3;
    
      val1 = 64;
      val2 = 65;
      val3 = 66;
    
      hFile = CreateFile(_T("C:\\archivo.txt"), GENERIC_WRITE, FILE_SHARE_READ,
                  NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
      if (hFile == INVALID_HANDLE_VALUE)
      {
         cout << "Error al abrir el archivo. " << endl;
      }
      else
      {
         WriteFile(hFile, &val1, sizeof(char), NULL, NULL);
         WriteFile(hFile, &val2, sizeof(char), NULL, NULL);
         WriteFile(hFile, &val3, sizeof(char), NULL, NULL);
         CloseHandle(hFile);
      }
    
      return EXIT_SUCCESS;
    }
    
    

Lo que contendría nuestro archivo después de haber corrido el programa anterior, sería:

A B C

De forma similar a lo expuesto en leer datos desde archivos, podemos escribir estructuras y búferes de caracteres. Recuerda, empero, que la estructura de tu archivo depende mucho de la interpretación que le des a los bytes. Solo ten eso en cuenta.

Anuncios
Categorías:C++, Cómo hacer, WIN-32 Etiquetas: ,
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s