txt lenguaje leer guardar funcion fputs fichero ejercicios datos binarios archivos archivo c fopen fclose freopen

lenguaje - Crea un archivo si no existe uno-C



fwrite en c (2)

Quiero que mi programa abra un archivo si existe, o bien crea el archivo. Estoy intentando el siguiente código pero obtengo una afirmación de depuración en freopen.c. ¿Sería mejor utilizar fclose y luego abrir inmediatamente después?

FILE *fptr; fptr = fopen("scores.dat", "rb+"); if(fptr == NULL) //if file does not exist, create it { freopen("scores.dat", "wb", fptr); }


Normalmente tiene que hacer esto en un solo syscall, o de lo contrario obtendrá una condición de carrera.

Esto se abrirá para lectura y escritura, creando el archivo si es necesario.

FILE *fp = fopen("scores.dat", "ab+");

Si quieres leerlo y luego escribir una nueva versión desde cero, hazlo como dos pasos.

FILE *fp = fopen("scores.dat", "rb"); if (fp) { read_scores(fp); } // Later... // truncates the file FILE *fp = fopen("scores.dat", "wb"); if (!fp) error(); write_scores(fp);


Si fptr es NULL , entonces no tiene un archivo abierto. Por lo tanto, no puedes freopen , solo debes fopen .

FILE *fptr; fptr = fopen("scores.dat", "rb+"); if(fptr == NULL) //if file does not exist, create it { fptr = fopen("scores.dat", "wb"); }

Nota : Dado que el comportamiento de su programa varía según si el archivo se abre en modo lectura o escritura, probablemente también necesite mantener una variable que indique cuál es el caso.

Un ejemplo completo

int main() { FILE *fptr; char there_was_error = 0; char opened_in_read = 1; fptr = fopen("scores.dat", "rb+"); if(fptr == NULL) //if file does not exist, create it { opened_in_read = 0; fptr = fopen("scores.dat", "wb"); if (fptr == NULL) there_was_error = 1; } if (there_was_error) { printf("Disc full or no permission/n"); return EXIT_FAILURE; } if (opened_in_read) printf("The file is opened in read mode." " Let''s read some cached data/n"); else printf("The file is opened in write mode." " Let''s do some processing and cache the results/n"); return EXIT_SUCCESS; }