Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] abrir cualquier tipo de archivo

Estas en el tema de abrir cualquier tipo de archivo en el foro de C/C++ en Foros del Web. Hola gente del foro, me gustaria saber si existe alguna forma de abrir cualquier tipo de archivo en c++, ejemplo #include <stdio.h> #include <stdlib.h> int ...
  #1 (permalink)  
Antiguo 27/03/2013, 15:07
Avatar de cajojeca  
Fecha de Ingreso: junio-2008
Mensajes: 77
Antigüedad: 15 años, 9 meses
Puntos: 0
abrir cualquier tipo de archivo

Hola gente del foro, me gustaria saber si existe alguna forma de abrir cualquier tipo de archivo en c++, ejemplo

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *fichero;

fichero = fopen( "nombre.txt", "r" );
int i=0;
char a[10];
while(!feof(fichero))
{
a[i] = (char)fgetc(fichero);
i++;
}

printf("%s",a);

system("PAUSE");

fclose(fichero);

return 0;
}

si en vez de colocar esa extencion, se puede colocar solamente el nombre del archivo, o en su defecto que vea la carpeta contenedora y si tiene un archivo sea cual sea que lo lea... ojala alguien me pueda ayudar... gracias
  #2 (permalink)  
Antiguo 27/03/2013, 15:24
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: abrir cualquier tipo de archivo

Se puede, sea cual sea la extensión todos los ficheros son iguales: Son cadenas de unos y ceros en el disco duro.

Para abrir un fichero que no es formato texto tienes que seleccionar el modo binario (rb):
Código:
FILE *fichero;
fichero = fopen("nombre.extension", "rb" );
Despues se uso la función fread para ir leyendo bytes del fichero... Luego ya esos bytes los tratas como quieras (los metes en una variable o los interpetras para alguna cosa...).
  #3 (permalink)  
Antiguo 27/03/2013, 15:29
Avatar de cajojeca  
Fecha de Ingreso: junio-2008
Mensajes: 77
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: abrir cualquier tipo de archivo

si eso lo se hacer, pero el tema es que necesito sacar esa extencion.... solo por el nombre.....
  #4 (permalink)  
Antiguo 27/03/2013, 15:32
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: abrir cualquier tipo de archivo

Cita:
Iniciado por cajojeca Ver Mensaje
si eso lo se hacer, pero el tema es que necesito sacar esa extencion.... solo por el nombre.....
Te refieres que por el nombre, deduzca la extensión? No te sigo...
  #5 (permalink)  
Antiguo 27/03/2013, 16:31
Avatar de cajojeca  
Fecha de Ingreso: junio-2008
Mensajes: 77
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: abrir cualquier tipo de archivo

por ejemplo, mi archivo se llama nombre.txt, pero solo necesito colocar nombre, sin la necesidad de colocar nombre.txt, no se si existe alguna forma .... ejemplo

fichero = fopen("nombre", "rb" ); // para que abra cualquier archivo con ese nombre.

ahi me explique bien??? graciass :)
  #6 (permalink)  
Antiguo 27/03/2013, 16:43
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: abrir cualquier tipo de archivo

Puedes usar una expresión regular:

Código C++:
Ver original
  1. "nombre.*"

http://www.cplusplus.com/reference/regex/



Edito: Previamente deberías listar los archivos del directorio
  #7 (permalink)  
Antiguo 27/03/2013, 19:21
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: abrir cualquier tipo de archivo

Las extensiones forman parte del nombre del fichero.

Se crearon para facilitar la asociación con el tipo de contenido y el programa que los abre/ejecuta. Nada más. Todos los ficheros son 0 y 1 continuados, que pueden leerse binariamente como números (octal, hexadecimal, decimal o binario) o textualmente como ascii carácter por carácter. Y en la práctica, puedes leerlo como te plazca.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor
  #8 (permalink)  
Antiguo 27/03/2013, 19:41
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: abrir cualquier tipo de archivo

No se que tiene que ver que todos los archivos sean 0 y 1 continuados con lo que está preguntando cajojeca.
  #9 (permalink)  
Antiguo 29/03/2013, 10:05
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: abrir cualquier tipo de archivo

"...0 y 1 continuados..."

Bienvenido a matrix :) De echo tampoco son 0 y 1, sino que son la representacion humanamente inteligible de una carga electrica almacenada en uno o varios sectores referenciados por plato / cara / cilindro / pista ...

"...estructura basada en un plato con circulos concentricos basados en algun material (depende del fabricante) de baja resistencia magnetica con algun oxido que reacciona facilmente al magnetismo y de baja oxidacion (depende nuevamente del fabricante), con lectoras magneticas con capacidad (el toston sigue 20 parrafos como minimo)..."

Bienvenido a google :))

Creo entender que lo que busca cajojeca es el listado de un directorio y por defecto la lectura de un archivo (supongo que mas adelante implementará algo mas concreto). La idea es: dada una ruta comprovar si es o no es un archivo, en caso que lo sea leerlo, y en caso que no lo sea considererlo un directorio, listar directorio, buscar primer archivo y leer. Tecnicamente no existe una forma estandarizada de trabajar archivos, las funciones adaptadas a ello dependen del sistema operativo (hay atajos para comprovar la existencia de un archivo pero pueden fallar, el p.ej. fopen parece que sirve para comprovar la existencia de un archivo pero pueden darse casos de falso resultado). Puede que haya alguna libreria preparada para funcionar en varios sistemas, no se es cuestion de buscar.

Con las funciones de c, puedes implementar algo que en casos habituales funcionará sin problema basandote en que lo que necesitas es leer el archivo, luego si no es leible es que o no es accesible, o no es un archivo o es un directorio, y siguiendo con la misma logica si no es leible lo tratas como un directorio e intentas listarlo, si no es listable es que o es un directorio no accesible o simplemente no es un directorio, si es listable buscas el primer archivo y repites los pasos: lo tratas como un archivo, si no es leible es que o no es accesible o no es un archivo, etc etc y asi repitiendo hasta que te cansaras de explorar directorios.

Si quieres hacerlo con wildcards (tal como te comenta carbon): o usas funciones propias del sistema o te creas tus propias funciones para separar el directorio del archivo, listar el directorio y comparar con el nombre de archivo (incluida la extension, o la parte de la extension, o el wildcard o por su defecto solo el nombre). Una vez localizado el archivo intentas acceder para lectura, si obtienes un erros significa que estas ante un subdirectorio, o estas ante un archivo para el que no tienes permiso de acceso para lectura o simplemente es una ruta que no existe. Si obtienes acceso pues ya lo tienes; si no tienes acceso lo tratas como subdirectorio y haces un nuevo listado.

No cuelgo nada de codigo, podria hacerse eterno encontrar todas las posibles implementaciones para la solucion. Si sabes de antemano que siempre vas a proporcionar un archivo sin extension (aunque el archivo objetivo la tenga o no la tenga, es igual), la cosa se complica:

Código:
miarchivo.txt        29/03/2013 - 16:22:56 123 kb
miarchivo.dat       46/03/2013 - 16:22:56 456 b
miarchivo             29/03/5000 - 16:22:56 789 mb
miarchivo.aaa      27/03/2013 - 16:22:56 0kb
Que archivo seleccionas como valido? Si todos son 'miarchivo', lo ordenas por fechas, por tamaños, por extension...?

Simplificando un poco mas, si sabes de antemano que vas a proporcionar un nombre de archivo (sin extension aunque el original la tenga) y que en ese directorio solo habrá un archivo llamado igual que ese y que ademas será accesible como lectura, entonces tienes la solucion con funciones de sistema para definir la ruta completa. La idea seria localizar el archivo (con wildcards para la extension o sin nada, las funciones de sistema suelen ser capaces de buscar), recoger su ruta absoluta y acceder para lectura. En windows puedes buscar un archivo con FindFirstFile (acepta *), esto te proporciona una serie de datos del archivo (a traves de la struct WIN32_FIND_DATA tienes el elemento cFileName que contendrá el nombre completo, extension incluida), seleccionas la ruta al directorio de la ruta proporcionada y accedes al nombre de archivo encontrado o sustituyes el nombre de archivo incompleto de la ruta proporcionada por el nombre de archivo completo encontrado y ya tienes acceso al archivo, a partir de ese momento ya puedes cargar con las funciones estandar de C o puedes leer con las propias de windows. Supongo que esto mismo puede traducirse a linux y a otros sistemas.

Siento no colgar nada de codigo. Por cierto, con que finalidad quieres implementar este codigo? Lo digo porque puede darse el caso que haya otras soluciones.

Saludos
vosk
  #10 (permalink)  
Antiguo 29/03/2013, 10:18
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: abrir cualquier tipo de archivo

Espera que me animo y pongo algo de codigo

Código:
void carga(char *dir, char *nombre) {
	DIR *dr;
  	struct dirent *de;
  	FILE *arx;
  	char buffer[1024];
  	int nbr;
  	
        //cambianos a directorio indicado
	chdir(dir);

        //listamos directorio actual
	if((dr = opendir("./"))) {
		while (de = readdir(dr)) {
                        //buscamos nombre de archivo sin extension
			if(strcmp("test", de->d_name) < 0) {
                                //ok, ya lo tienes
				if((arx = fopen(de->d_name, "r"))) {
					nbr = fread(buffer, 1, sizeof(buffer), arx);
					buffer[nbr] = '\0';
					printf(buffer);
					fclose(arx);
				}
				break;
			}
		}
		closedir(dr);
	}
}

carga("C:/", "test");
Ten en cuenta que es posible que este codigo no te de acceso a todos los archivos, pero como forma estandar de proceder cumple con el objetivo.

Saludos
vosk
  #11 (permalink)  
Antiguo 29/03/2013, 10:27
Avatar de cajojeca  
Fecha de Ingreso: junio-2008
Mensajes: 77
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: abrir cualquier tipo de archivo

muy buena la ayuda...... al final lo solucione, pasando el directorio a un string y desde ahi q me de la opcion de elegir el archivo, y lo leo, para finalmente sacar algunos datos, configurarlo como se me ocurra y almacenar ese dato o datos en la BD. para leerlo utilice el ifstream y getline.....
  #12 (permalink)  
Antiguo 29/03/2013, 13:12
 
Fecha de Ingreso: diciembre-2012
Mensajes: 223
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: abrir cualquier tipo de archivo

Lo que estas usando es c. Para hacerlo en c++ se utiliza fstream.

Código C++:
Ver original
  1. #include <iostream> // cout, cin
  2. #include <fstream> // fstream
  3.  
  4. int main(){
  5.         std::fstream archivo("datos.txt", std::ios::in | std::ios::out | std::ios::app);
  6.         archivo.clear();
  7.         archivo << "Texto a escribir en el archivo" ;
  8.         archivo.close();
  9.         return 0;
  10. }

Etiquetas: c++
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:05.