¿Cómo defino y paso un nombre de archivo a fopen () desde la línea de comandos?

Tengo el siguiente progtwig que escribe la entrada de un usuario en un archivo. Actualmente el archivo a escribir está predefinido; sin embargo, quería permitir al usuario definir el nombre del archivo desde el símbolo del sistema. ¿Cuál sería la mejor manera de agregar esta funcionalidad? Tengo problemas para entender cómo haría que la cadena ingresada por el usuario fuera un argumento en la función fopen (). ¿Debo usar scanf () o crear otra getchar () mientras el bucle almacena los caracteres en una matriz y luego crear una variable como el argumento de fopen () o algo así?

#include  int main() { char c; FILE *fp; fp = fopen("file.txt", "w"); while ((c = getchar()) != EOF) { putc(c, fp); } return 0; } 

Para eso son los argumentos principales:

 #include  int main(int argc, char **argv) { char c; FILE *fp; if (argc >= 2) fp = fopen(argv[1], "w"); else fp = fopen("file.txt", "w"); while ((c = getchar()) != EOF) { putc(c, fp); } return 0; } 

Si sigues esto, podrías preguntarte qué hay en argv[0] . Ahí es donde está el nombre del progtwig. Algunos entornos de sistema operativo ponen la ruta completa al archivo ejecutable allí. Otros ponen solo el nombre del progtwig. Otros todavía ponen lo que estaba escrito.

Para el comando ../../bin/someprogram

en Windows, argv[0] es "C:\\Documents and Settings\\User\bin\\someprogram.exe"
en Linux / bash, argv[0] es ../../bin/someprogram
en Ultrix / csh, (creo) argv[0] es /home/username/bin/someprogram

Usa argc y argv

 #include  int main(int argc, char **argv) { char c; FILE *fp; if(argc < 2){ printf("Usage : ./a.out "); exit(0); } fp = fopen(argv[1], "w"); while ((c = getchar()) != EOF) { putc(c, fp); } return 0; } 

Definir principal de esta manera:

 int main(int argc, char *argv[]) { 

Y luego use argv: una matriz de los argumentos de la línea de comandos. argv [0] es el nombre del comando tal como se ingresó en la línea de comando, argv [1] es el primer argumento.

  fp = fopen(argv[1], "w'); 

Probablemente desee verificar ese argumento argc> 1 para evitar un acceso a la matriz fuera de los límites.

Hay muchas funciones para leer en cadenas; fgets y scanf , por ejemplo. El problema es que necesita saber el número máximo de caracteres que desea leer de antemano. Si esto está bien para ti, entonces usa uno de esos. Si no, tendrás que escribir tu propia función para leer en una cadena dinámica, como aquí .