Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/11/2009, 06:19
Gaudeamus
 
Fecha de Ingreso: noviembre-2009
Mensajes: 8
Antigüedad: 14 años, 6 meses
Puntos: 0
Problema con fopen

Buenos días,

Soy un aprendiz de aprendiz de programador (error voluntario), y llegado cierto punto de mis lecturas decidí hacer una práctica sobre lectura y escritura de archivos.

Este es el código (C/C++)

Código:
#include <stdio.h>
#include <string.h>

FILE creararchivo(char nombredearchivo[50]);

int main (){
    char nombre[9];
    int i;
    printf("Escribe un nombre de archivo (no incluyas la extension)\n");
    scanf("%s", &nombre);
    for ( i = 0; i < 9; i++ )
    {
        if ( nombre[i] == '\n' )
        {
            nombre[i] = '\0';
            break;
        }
    }
    FILE archivocreado = creararchivo(nombre);
    fclose(&archivocreado);
    getchar();
    return 0;
}


FILE creararchivo(char nombredearchivo[9]){
     const char *definitivo = strcat(nombredearchivo, ".txt");
     FILE *medioarchivo = fopen(definitivo, "w");
     return *medioarchivo;
     }

Mi intención era, dado que el prototipo de fopen pide CONST CHAR, poder pasar como argumento el nombre de archivo, que luego queda grabado como CONST char en la función, y así poder establecer el nombre de archivo en cualquier momento (sí, sé que puedo pasar el nombre de archivo directamente como argumento a la función principal, pero mi cuestión (más adelante) sigue presente).

La cuestión es que me gustaría que la función creararchivo tan sólo se encargase de abrir el archivo, para luego poder modular el resto de operaciones desde otras funciones... pero no consigo guardar el puntero al archivo en una variable de main.

El código mostrado arriba compila sin errores en DevC++ sobre windows XP SP3, pero al ejecutarlo, da error y cierra el programa una vez creado el archivo. He probado a usar fclose antes de devolver medioarchivo, pero da igual.

Los detalles del error son:

Código Error:
Ver original
  1. AppName: archivo.exe     AppVer: 0.0.0.0     ModName: ntdll.dll
  2. ModVer: 5.1.2600.5755    Offset: 0001b21a

No creo que aporte nada, aunque con lo poco que sé, bien podría equivocarme.

Por lo que veo, el error está en:

Código:
     return *medioarchivo;
y

Código:
    FILE archivocreado = creararchivo(nombre);

He visto este mensaje del foro: f96/como-saber-si-existe-archivo-c-658894/ (añádase el comienzo de la dirección, como no tengo 30 días no me deja poner el enlace), pero en el mensaje no intentan retornar el archivo, y además utilizan fopen con un valor variable, algo que Dev-C++ no tiene ninguna intención de dejarme hacer :)

Se admiten todo tipo de comentarios y sugerencias, tanto de mi problema principal, como del código en sí, que ya asumo que por mi inexperiencia será bastante cutre.

Un saludo,