¡Como abrir un archivo txt en C++!

Como abrir archivos en C++ para leer y guardar datos.

Hoy he decidido compartirles como abrir y leer un archivo de texto en C++, lo haremos con ayuda de la función fopen, de paso les explico cómo escribir en el también, al final después de haber hecho todo lo que queremos con dicho archivo lo cerraremos con ayuda de la función fclose, solo para liberar la memoria.

El procedimiento para abrir un archivo txt es sencillo, empezamos declarando una variable donde vamos a almacenar todo el contenido de nuestro archivo, ya saben que en este lenguaje siempre se indica el tipo de variable sea char, int, float en este caso la variable será de tipo File, posterior a declarar la variable la cual yo llamaré "archivo" podremos utilizar la función que tiene tan solo 2 parámetros, en el primero va el nombre de archivo entre comillas y en el segundo indicaremos siempre el modo con que queremos abrirlo, es decir el objetivo, si queremos leerlo, escribirlo, leerlo y escribirlo o incluso crearlo automáticamente si todavía no existe, pasemos primero al ejemplo y ya luego explico más lo de los modos.

Codigo para abrir un archivo de texto en C++



#include <cstdlib>
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
FILE * archivo;

archivo = fopen ("documento.txt", "w+"); //Aqui abrimos el archivo documento.txt .
// "w+" significa que queremos leer y escribir en el, y que si no existe lo cree.

fprintf(archivo, "Quiero guardar este texto"); // Funcion para guardar texto, abajo la explico.

fclose(archivo); // Cerramos el archivo y se libera la memoria

system("pause");
return 0;
}


Creando archivo en C++ y guardar texto, ejemplo compilado.

Como puede observar he usado la función fprintf();, esta nos servirá para escribir el texto que queremos, si el texto está almacenado en una variable entonces en el segundo campo irá el nombre de dicha variable.

Quizá se pregunte, ¿y donde quedará mi nuevo archivo de texto?, este quedará en la misma carpeta del archivo ejecutable es decir del .exe que usted está compilando, y si se pregunta dónde está ahora mismo ese archivo, esto dependerá de su IDE por ejemplo en Codeblocks se localiza dentro de su carpeta de proyecto, sub carpeta bin y sub carpeta debug, en Dev C++ es más fácil encontrarlo.

Como leer el contenido de un archivo de texto.



Ahora que ya sabemos cómo crear y actualizar el contenido de un archivo de texto, veamos como leerlo, haremos uso de la función fread() que básicamente significa file read es decir lectura de archivo, esta función permite guardar en una variable el contenido de nuestro archivo, esta variable la llamaré texto, también nos pide en el segundo parámetro de esta función la cantidad de caracteres que leeremos, como queremos leer el documento entero lo haremos de forma automática con ayuda de otra función, veamos el ejemplo.

#include <cstdlib>
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
FILE * archivo;
long medida;
char * texto;

archivo = fopen ("documento.txt", "r"); // "r" significa solo lectura, abajo explicaré los modos

// Las siguientes tres lineas nos permiten conocer la cantidad de texto
// que tiene el archivo y guardamos este dato en la variable "medida"
// este dato se necesita para la funcion fread
fseek (archivo , 0 , SEEK_END);
medida = ftell (archivo);
rewind (archivo);

// La siguiente linea asigna de forma automatica la memoria del archivo completo
texto = (char*) malloc (sizeof(char)*medida);

// Ahora por fin almacenamos el texto del archivo en la variable texto
fread(texto, medida+1, 1, archivo);

// vemos su contenido por pantalla
cout << texto << endl;
fclose(archivo);

system("pause");
return 0;
}


Leyendo archivo de texto con C++, funcion fread.

Modos de apertura de archivos en C++



Son 6 los modos de apertura disponibles en este lenguaje, recuerde que tiene que elegir 1 modo cada vez que abre un archivo, y tanto si quiere escribir texto en el como si quiere leerlo tendrá que abrir primero el archivo, en la siguiente tabla les dejo la lista.

r Read: abre el archivo para lectura, es necesario que el archivo exista.

w Write: Crea un archivo vacío para guardar texto en el, si el archivo existe su contenido será reescrito.

a append: Abre el archivo para agregar contenido al final del mismo, su contenido actual no se borra, solo se agrega nuevo contenido al final, si el archivo no existe se crea.

r+ Read/Write: Este modo es muy util, con el podemos tanto leer su contenido como escribir nuevo contenido en el mismo, pero el archivo debe de existir.

w+ Write/Read: Lo mismo que el anterior pero en este caso si el archivo no existe lo creará y si el archivo existe su contenido será reescrito con el nuevo contenido, este es el modo más utilizado.

a+: Es similar a append pero se pueden usar las funciones fseek fsetpos y rewind.
Comentarios y preguntas
Carlos:
Hola tengo un problema al crear el archivo no se ejecuta, osea nunca se crea el documento de texto
Codigazo:
Hola Carlos, ¿a cual de los dos ejemplos se refiere?, el primer código sirve para abrir un archivo y de ser necesario crearlo en caso que no exista, adicionalmente en ese primer ejemplo estamos guardando texto, si por otra parte ha ejecutado el segundo ejemplo que sirve para únicamente leer el archivo de texto, entonces no lo creará automáticamente, el archivo ya debe de existir y ha de tener contenido dentro para ser leído.
cesar:
muchas gracias por ayudarnos a aprender esto que es programacion que para mi es una pasion
Andres:
Mi codeblocks no crea ningun archivo, estoy haciendo lo mismo del ejemplo y me compila bien pero no se crea nada en la carpeta
Codigazo:
Hola Andres, el archivo ejecutable se crea dentro de la carpeta del proyecto ingresando a la sub carpeta "bin" y luego a "Debug". Verifique también que el proyecto que está editando realmente esté en la carpeta que usted cree. Para finalizar verifique el panel del Code Blocks llamado "logs & others" en la pestaña Build messages, si ahí aparece algún warning o código de error envíemelo para analizarlo.
AXEL :
hay alguna manera de abrir el archivo automaticamente despues llenarlo?
Codigazo:
Hola AXEL, si claro, para lograr este efecto lo que tiene que hacer es abrirlo nuevamente para lectura con fopen y leer linea a linea tal y como se muestra en el ejemplo anterior.
Ariel:
Estoy ejecutando en Windows 7 ambos códigos, el de lectura y el de escritura, sin problemas de compilación ninguno de los dos.
El de lectura lee el archivo sin problemas, resultado esperado.
El de escritura no logra crear el archivo.
He probado otras formas para leer y escribir y la lectura siempre funciona bien pero la escritura no genera el archivo.
Hay muchos comentarios al respecto en otros sitios también.
¿No sera que hay que darle algún permiso al programa .exe para que pueda crear archivos, es decir que tenga que ver con algún tipo de restricción (permiso) del Windows?
En todo caso lo he ejecutado, en modo de compatibilidad con Windows 7 y como administrador y no logro que escriba el archivo.
¿alguna idea?
Codigazo:
Hola Ariel, para este codigo no importa el sistema operativo. En cuanto a permisos de ejecución no son necesarios porque estos los pide el sistema operativo de forma automática y solo los requiere el sistema operativo si el programa va a realizar algún cambio en carpetas del sistema, esto para protección, en el resto de directorios no son necesarios.

Si usted está seguro que está ejecutando el mismo codigo de los ejemplos anteriores, entonces su archivo si se está creando, ahora bien, queda descubrir en que parte se crea. Si usted ejecuta el proyecto directamente en el compilador en Code Blocks, este archivo de texto no se creará en la carpeta donde está el archivo binario es decir el ".exe", se creará donde están los archivos del proyecto como el main.cpp que es la misma localidad donde está el ".cbp".

Pruebe ejecutando el primer codigo de ejemplo de este articulo cambiando la linea

archivo = fopen ("documentote.txt", "w+");  //Aqui abrimos el archivo documento.txt .


por

archivo = fopen ("C:/Users/Usuario/Desktop/eldocumento.txt", "w+");


Ademas, en la linea anterior cambie donde dice "Usuario" por el nombre de su usuario en Windows 7, el archivo se creará en el escritorio sin importar la ruta donde se ejecute el programa, de ser así se comprueba que si se estaba creando el archivo con el codigo del ejemplo pero en una ubicación no identificada.
martha:
que pasa si quiere leer dos archivos diferentes en el mismo programa ?
Codigazo:
Solo tendrá que repetir las funciones para abrir, para escribir y para cerrar el documento. En el siguiente ejemplo creamos dos archivos y guardamos 2 veces información.

#include <cstdlib>
#include <iostream>
#include <cstdio>

using namespace std;

int main()

{

FILE * archivo;

archivo = fopen ("documento.txt", "w+"); //Aqui abrimos el archivo documento.txt .
fprintf(archivo, "Quiero guardar este texto"); // Funcion para guardar texto, abajo la explico.
fclose(archivo); // Cerramos el archivo y se libera la memoria

archivo = fopen ("documento2.txt", "w+"); //Aqui abrimos el archivo documento.txt .
fprintf(archivo, "Segundotexto"); // Funcion para guardar texto, abajo la explico.
fclose(archivo); // Cerramos el archivo y se libera la memoria

system("pause");
return 0;

}