Cómo usar el índice en el nombre del archivo

Esta es probablemente una pregunta trivial. No soy un progtwigdor profesional, soy más bien un matemático que está haciendo algún experimento numérico usando C. Me gustaría que la salida de mi experimento se escribiera en diferentes archivos para diferentes valores de un parámetro. MWE debería hacer algo como esto. Crear un puntero de archivo indexado por i. Abra un archivo llamado archivo [i]. Escriba i en ese archivo y luego ciérrelo. El código de abajo, obviamente, no se comstack. ¿Es tal construcción incluso posible?

#include int i; int main() { for (i = 0; i < 10; i++){ FILE *f(i); f(i)=fopen("file"[i],"w"); fprintf(f(i),"%d \n", i); fclose(f(i)); } return 0; } 

Edit: Tengo varias respuestas decentes, pero ¿alguien puede ayudar a solucionar el problema del sprintf? Es decir, en OpenBSD que utilizo sprintf no se recomienda. Asi recibo este mensaje

 $ gcc test.c /tmp//ccN31aTv.o(.text+0x41): In function `main': : warning: sprintf() is often misused, please use snprintf() 

Cuando sustituyo sprintf con snprintf recibo todo tipo de advertencias

 $ gcc test.c test.c: In function 'main': test.c:9: warning: passing argument 2 of 'snprintf' makes integer from pointer without a cast test.c:9: warning: passing argument 3 of 'snprintf' makes pointer from integer without a cast 

Eso no me parece un código de gran calidad.

Solución final: Sólo quiero documentar la solución final. ProPolice y systrace están satisfechos con este código en OpenBSD. Gracias a todos los que ayudaron!

 #include int i; char buf[20]; int main() { for (i = 0; i < 10; i++){ snprintf(buf, sizeof(buf), "filename%d", i); FILE *f = fopen( buf, "w"); fprintf(f,"%d \n", i); fclose(f); } return 0; } 

En C, use snprintf:

 char buf[PATH_MAX]; snprintf(buf, sizeof(buf), "file%d", i); 

Si usas linux, hay una extensión útil de GNU:

 char *name; asprintf(&name. "file%d", i); 

Debe recordar liberar (nombre) después de su uso.

Tenga en cuenta que su syntax FILE *f(i); aunque no es válido

Si necesita declarar una matriz de ARCHIVO * de 10 elementos, haga lo siguiente:

 FILE *array[10]; 

entonces úsalo así:

 array[i] = fopen(filename, "W"); 

Utilice sprintf para generar el nombre de archivo.

 char buf[80]; sprintf(buf,"file%d", i); fopen(buf,"w"); 

La syntax de la matriz en C usa corchetes [] .

Usted puede simplemente construir una cadena con sprintf . Asegúrese de que su búfer es lo suficientemente grande:

 char filename[20]; sprintf( filename, "file%d", i ); 

Entonces puedes abrirlo así:

 FILE *f = fopen( filename, "w"); ... fclose(f); 

No es necesario usar una matriz (si eso es lo que intentabas hacer con f(i) ), porque solo mantienes un archivo abierto a la vez.

Si desea que sus archivos puedan file001 texto, es posible que desee file001 , file002 etc … Puede usar %03d lugar de %d a 0-pad hasta 3 dígitos.

Podrías probar esto:

 #include  #include  int main(void) { int i = 0; for (i = 0; i < 10; i++) { char filename[64]; sprintf(filename, "file%d", i); FILE *fp = fopen(filename, "w"); fprintf(fp, "%d\n", i); fclose(fp); } return 0; } 

Tu código está casi bien. Algunas observaciones:

  • Utilice sprintf para crear el nombre del archivo. En C no hay un operador de cuerdas concatenado.
  • No es necesario crear una matriz de punteros de archivo.
  • Y, por supuesto, esto puede mejorarse: manejar el tamaño del nombre de archivo, rellenar los números, etc.