Cambiar nombre de un archivo mediante una variable. Ayuda! -> [Ms-dos en C++]

Iniciado por elcyberchavo, 5 Abril 2007, 04:26 AM

0 Miembros y 1 Visitante están viendo este tema.

elcyberchavo

Hola!
Felicidades por este Foro!
Bueno, tengo un problemilla al tratar de renombrar un archivo.

Este es el código que tengo -para explicarme mejor.

#include<stdio.h>  //Manejo de archivos
#include<conio.h>  //Manejo de clrscr()
#include<string.h> //Manejo de cadenas de texto.

   main(){

      FILE *archivo1;
      char letras;
      char *nombre_archivo[30];

   clrscr();
      printf("\n\nESTE PROGRAMA CAPTURA CARACTERES DEL TECLADO Y LOS GUARDA EN UN ARCHIVO!.\n\n");
      printf("Anote el Nombre del archivo incluyendo extensi¢n:\n");
      gets(nombre_archivo);
      printf("\nAnote el texto que desea grabar en el archivo %c y presione ENTER para terminar.\n\n\r",nombre_archivo);

      archivo1=fopen("C:\\archivo1.txt","w");

      while((letras=getche()) !='\r') //Ciclo mientras el car cter capturado sea diferente de ENTER.
      {
      putc(letras,archivo1); //Graba el car cter capturado en el archivo.
      }

      fclose(archivo1);
      rename("C:\\archivo1.txt","C:\\%c",char *nombre_archivo);
      printf("\n\n\n\nSe creo el archivo de texto %c cuyo contenido puede desplegarse con el comando TYPE\n\n", nombre_archivo);
      printf("\n\nOprima cualquier tecla para salir...");
      printf("\a"); //Pitido xD


   getch();
   return 0;
  }

Bueno, como ven mi archivo tiene el nombre de "archivo1.txt" y quiero cambiarlo por el nombre que se introduzca. Se puede poner el nombre que se teclee desde el principio? O sea que ya no ponga "archivo1.txt" sino ponga lo que se teclee.

De antemano gracias por dedicar tiempo a leer esto.
Saludos!


Aprovechando, tratando de matar dos pájaros de un tiro.

Mmm... existen comandos del ms-dos, por ejemplo: dir, time, ipconfig, entre otros. Bueno, lo que pretendo es utilizar un comando de esos en el código de Turbo c++ y no se como incluirlo, no me sale  >:(
Yo hago algo como esto:
printf("Mi ip es: 'ipconfig'");

Ni idea tengo de como se hace.
Otra ves saludos!

~~

Si, si q existe un tuto de ms-dos, mira:
http://foro.elhacker.net/index.php/topic,18148.0.html

Para llamar a estas funciones dsde C, tienes q usar system() (recuerda incluir windows.h ;))
Para cambiar el nombre tendrias q usar esto:

system("rename C:\\archivo1.txt C:\\arch.txt")

Por ejemplo.
En tu codigo puedes crear el archivo directamente con la variable q has recogido desde el teclado, en vez de poner esto: archivo1=fopen("C:\\archivo1.txt","w"); pones en el primer parametro el char* q contiene el nombre del archivo y ya esta:

archivo1=fopen(nombre_archivo,"w");


Y creo q ya te e contestado a todo ;).
Te enseño un trukillo ya q estoy. Para usar dir por ejemplo desde C y sacar solamente algun dato puedes hacer esto:

system("dir > C:\\dir.txt");

Como veras se guarda en un archivo lo q deberia salir en el ms-dos, ahora solo es cuestion de abrirlo y de sacar lo q tu kieras ;)

Aaaah y otra cosa q se me olvidaba, recuerda q la funcion system lo q toma es un char*, asi q puedes construir un char con los datos q tu kieras (o q el user introduzca por ej) y luego llamarla  :xD

1S4ludo

elcyberchavo

Gracias por tu respuesta.

Bueno, no se si no me pude explicar al momento de plantear mi duda o no puedo interpretar tu respuesta o mi Turbo C++ Versión 3.0 no lo corre, pero utilizo system () y librería windows pero pss no me resulta.

Lo que deseo hacer en el código de arriba como se interpreta. Corre el programa, me pide un nombre para el archivo, se introduce dicho nombre en la variable "nombre_archivo", se capturan los datos que se desee, al momento de presionar ENTER es como finalizar la captura, se presiona una tecla cualsea y fin!, se termina el programilla. Bueno, entre el código  y más específicamente esta parte: rename("C:\\archivo1.txt","C:\\%c",char *nombre_archivo);  donde intento cambiarla por el nombre que contiene la variable, cosa que no me sale.
Supongo que hay otras formas de hacer lo que deseo.

Por lo de utilizar comandos de MS-DOS en Turbo c++ y ejecutarlos desde allí pss ando mirando el enlace que me mandaste, haber si encuentro algo.
Saludos!

~~

Citarrename("C:\\archivo1.txt","C:\\%c",char *nombre_archivo);

Es q eso esta mal usado  :xD Tanto la sintaxis de C como la del MS-DOS esta mal. Mira te explico. La sintaxis de rename es esta:

rename C:\arch1.exe arch2.exe

Y para usarla desde C tendrias q hacer esto:

#include <windows.h>

int main()
{
   system ("rename C:\\arch1.exe arch2.exe");
   return 0;
}


Para usarlo en tu caso yo te recomiendo lo siguiente. Create un char* que contenga rename C:\\archivo1.txt (es importante q despues de rename te kede un espacio) a ese char le sumas al final nombre_archivo y despues desde system llamas a ese char resultante, suma de llos otros dos. Lo entiendes??

De esa manera encadenarias el rename C:\archivo1.txt con el nombre tecleado, y luego llamarias con system a todo junto

1S4ludo




Juan_Perez

No es necesario que utilices un archivo auxiliar y después renombrarlo tal como lo haces en el código que pusistes, así puedes poner directamente

archivo1=fopen(nombre_archivo,"w");

sólo que hacerlo de esta manera conlleva algo de riesgo, ya que podrías darle accidentalmente el nombre de algún archivo que ya exista en el disco y borrarlo. Para evitar esto tendrías que verificarlo, poniendo antes la línea

archivo1=fopen(nombre_archivo,"r");

y comparar archivo1 con NULL. Si es distinto quiere decir que el archivo ya existe.

Por otra parte, si de verdad quieres renombrar un archivo, la función rename está disponible en Turbo C y está declarada en <stdio.h> así

int rename (const char *oldname, const char *newname);

en caso de que el archivo se renombre la función regresa el valor de zero y si no pudo renombrarlo regresa el valor de -1, y  modifica la variable global errno indicando el tipo de error ocurrido.

huskerone

Cita de: Juan_Perez en  6 Abril 2007, 10:12 AM
No es necesario que utilices un archivo auxiliar y después renombrarlo tal como lo haces en el código que pusistes, así puedes poner directamente

archivo1=fopen(nombre_archivo,"w");

sólo que hacerlo de esta manera conlleva algo de riesgo, ya que podrías darle accidentalmente el nombre de algún archivo que ya exista en el disco y borrarlo. Para evitar esto tendrías que verificarlo, poniendo antes la línea

archivo1=fopen(nombre_archivo,"r");

y comparar archivo1 con NULL. Si es distinto quiere decir que el archivo ya existe.

Por otra parte, si de verdad quieres renombrar un archivo, la función rename está disponible en Turbo C y está declarada en <stdio.h> así

int rename (const char *oldname, const char *newname);

en caso de que el archivo se renombre la función regresa el valor de zero y si no pudo renombrarlo regresa el valor de -1, y  modifica la variable global errno indicando el tipo de error ocurrido.

holas,soy un estudiante nuevo en la programacion, he hecho lo anterior y ha funcionado, pero como hago si quiero que el usuario
por ejemplo ingrese su nombre, y yo crear un archivo con ese nombre, pero con una extension  , por ejemplo dat, la extension NO la da el usuario.
probe con archivo1=fopen(nombre_archivo.dat,"w");
pero no funciona
he pensado tambien usar
system("rename nombreactual nuevonombre.txt")
pero por ejemplo como pongo la variable que se ha ingresado en vez de nombreactual
entonces, digamos si el usuario entra su nombre, yo creo un archivo con con el nombre del usuario

cout<<"digitte su nombre";
cin>>nombre;
archivo1=fopen(nombre,"a+");
system("rename nombre nuevonombre.dat");
?


satu

Hola

Lo primero léete las reglas del foro. Este post lleva inactivo 4 años

Para lo que preguntas prueba poniendo el nombre del fichero entre comillas dobles "

Saludos
Breakbeat como forma de vida

rir3760

Cita de: huskerone en 29 Agosto 2011, 23:09 PMcomo hago si quiero que el usuario por ejemplo ingrese su nombre, y yo crear un archivo con ese nombre, pero con una extension  , por ejemplo dat, la extension NO la da el usuario.
No deberías combinar los lenguajes, si utilizas C++ puedes utilizar un objeto de la clase string (y para el caso sus clases para el manejo de archivos).

Tal como esta el pequeño fragmento que mencionas primero pides el nombre y después agregas la extensión mediante la función strcat (prototipo en <cstring>), mas o menos así:
Código (cpp) [Seleccionar]
cout << "Digite su nombre: ";
cin >> nombre;

// Se agrega la extension al final de la cadena
strcat(nombre, ".dat")
archivo1 = fopen(nombre, "a+");

// ...


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

huskerone

jeje muchas gracias nunca se me hubiera ocurrido, funciono perfecto. ;-)