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

Problema con fopen

Estas en el tema de Problema con fopen en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 19/11/2009, 06:19
 
Fecha de Ingreso: noviembre-2009
Mensajes: 8
Antigüedad: 14 años, 5 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,
  #2 (permalink)  
Antiguo 19/11/2009, 07:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Problema con fopen

Devolve un puntero a FILE (es una estructura), no FILE.

Código:
FILE *creararchivo(char *nombredearchivo);
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 19/11/2009, 08:58
 
Fecha de Ingreso: noviembre-2009
Mensajes: 8
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: Problema con fopen

Muchas gracias :) ahora funciona correctamente.

Sin embargo, y aunque creo que cojo la idea por encima (no puedes devolver la estructura entera, sino sólo un puntero), no entiendo por qué permite una cosa sí y la otra no... supongo que a medida que aprenda más de programación esta y otras dudas se responderán solas :)
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 19:10.