Noviembre 18, 2017, 02:35:43 am

Autor Tema: Forzar a fflush para que de error[C]  (Leído 2546 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Forzar a fflush para que de error[C]
« en: Mayo 12, 2017, 01:28:52 pm »
Hola, ¿cómo están?
Estoy haciendo una plantilla para aprender y tener siempre a mano lo que voy aprendiendo de archivos en lenguaje C, ya casi tengo todo terminado solo que me falta la parte de errores y para ello necesito saber como hacer que fflush falle, si abro el archivo para solo lectura errno me da el error 9  (Bad file descriptor) esto ya lo tengo pero lo que quiero es producir el error cerrando el archivo antes de escribir con fflush pero lo que hace es no escribir en el archivo pero no me muestra ningún error, me podrían decir como debo hacer.

El Programa(fclose( ptrGtTxt );)

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#define MAX 80
#define N_A_TXT "archGuiaTel.txt"
#define N_A_BAK "archGuiaTel.bak"

void ingresarFrase( char frase[] );
void copiar( char frase[] );
void mostrar( void );
void errorEscritura( void );
void copiaDeSeguridad( const char *GtTxt, const char *GtBak );
void limpiar( void );
void mensaje( char funcionError[] );
 
int main( void ){
char frase[MAX];

ingresarFrase( frase );
copiar( frase );
mostrar(  );
copiaDeSeguridad( N_A_TXT, N_A_BAK );

return EXIT_SUCCESS;
}
 
void ingresarFrase( char frase[] ){
int ok=0;

do{
printf( "\n Ingrese frase.....:" );
fgets( frase, MAX, stdin );
ok = strlen( frase );
}while( ok <= 1 );
}
       
void copiar( char frase[] ){
FILE *ptrGtTxt;
char funcionError[20];

if( !(ptrGtTxt = fopen( N_A_TXT, "a+" ))){
strcpy( funcionError, "copiarFopen" );
mensaje( funcionError );
exit(1);
    }

fprintf( ptrGtTxt, "%s", frase );

fclose( ptrGtTxt );
if( fflush( ptrGtTxt ) != 0){
strcpy( funcionError, "copiarFflush" );
mensaje( funcionError );
errorEscritura( );
exit(1);
}

if( ( fclose( ptrGtTxt ) ) ){
mensaje( funcionError );
exit(1);
}
}

void mostrar( void ){
FILE *ptrGtTxt;
char texto[100], funcionError[] = "mostrar";

if( !(ptrGtTxt = fopen( N_A_TXT, "r" ))){
mensaje( funcionError );
exit(1);
    }

printf( "\n ========== Contenido del archivo ==========\n" );
fgets( texto, 100, ptrGtTxt);
while( feof(ptrGtTxt) == 0 ){
printf( "%s",texto );
fgets(texto, 100, ptrGtTxt);
}

if( ( fclose( ptrGtTxt ) ) ){
mensaje( funcionError );
exit(1);
}
}

void errorEscritura( void ){
char funcionError[] = "errorEscritura";

if(remove( "archGuiaTel.txt" ) !=0 ){
mensaje( funcionError );
exit(1);
}

if( rename( N_A_BAK, N_A_TXT ) !=0 ){
mensaje( funcionError );
exit(1);
}
}

void copiaDeSeguridad( const char *GtTxt, const char *GtBak ){
FILE *ptrGtTxt, *ptrGtBak; 
char c, x;
char funcionError[] = "copiaDeSeguridad";

if( !( ptrGtTxt = fopen( GtTxt, "r" ))){
mensaje( funcionError );
exit(1);                               
}
if( !( ptrGtBak = fopen( GtBak, "w" ))){
mensaje( funcionError );
exit(1);                               
}
     
c = fgetc( ptrGtTxt );
while ( c != EOF ){
x = fputc( c, ptrGtBak );
if (x != c){
mensaje( funcionError );
exit(1);                               
}
c = fgetc( ptrGtTxt );
}
     
if( ( fclose( ptrGtTxt ) ) ){
mensaje( funcionError );
exit(1);                               
}
if( ( fclose( ptrGtBak ) ) ){
mensaje( funcionError );
exit(1);                               
}
}

void limpiar( void ){
system( "cls || clear" );
}

void mensaje( char funcionError[] ){
int ch, a, errnum;;
errnum = errno;

limpiar();
printf("\n %d\n", errnum);

if( strcmp( funcionError,"copiarFopen") == 0 ){
printf("\n Error al abrir el archivo \"%s\" \n El fichero o directorio no existe...", N_A_TXT);
}
if( strcmp( funcionError,"copiarFflush") == 0 ){
printf("\n Error al abrir el archivo \"%s\" \n El fichero o directorio no existe...", N_A_TXT);
}

printf( "\n\n\t Pulse <Enter> para finalizar..."); a = getchar();
    if( a != '\n') while ((ch = getchar()) != EOF && ch != '\n');
}
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado .xAk.

  • el engendro
  • Moderador
  • *****
  • Mensajes: 7298
  • Sexo: Masculino
  • F0r3v3R NeWbI3
    • Ver Perfil
Re:Forzar a fflush para que de error[C]
« Respuesta #1 en: Mayo 14, 2017, 10:03:55 am »
puedes utilizar fsync en lugar de fflush, para tratar con la salida de error:

apps/inc/libc/unistd.h

fsync

Código: You are not allowed to view links. Register or Login
LIBC_API
int
fsync (
    int FileDescriptor
    );

Descrpción

Esta rutina descarga todos los datos asociados con el descriptor de archivo abierto a su dispositivo de respaldo correspondiente. No retorna hasta que los datos hayan sido descargados.

Parametros

FileDescriptor Suministra el descriptor de archivo devuelto por la función open.

Valor de Return

0 en el éxito.
-1 en caso de fallo, y la variable errno se establecerá para contener más información.

Saludos
Is the truth out there?

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:Forzar a fflush para que de error[C]
« Respuesta #2 en: Mayo 15, 2017, 11:09:41 am »
Hola, .xAk.
Muy interesante la función, pero por lo que pude leer es exclusiva de Linux y yo practico con Linux y Windows. -
Igual muchas gracias por ocuparte. -

Saludos.
Daniel

Desconectado .xAk.

  • el engendro
  • Moderador
  • *****
  • Mensajes: 7298
  • Sexo: Masculino
  • F0r3v3R NeWbI3
    • Ver Perfil
Re:Forzar a fflush para que de error[C]
« Respuesta #3 en: Mayo 16, 2017, 12:03:10 pm »
¿Cómo cierras el archivo antes? quieres que te señale error, en caso de que tras volvar el contenido en el archivo no se guarde, me ha parecido entender. Una vez creado y siendo de contenido vacio, puedes comprobar después que ha variado el tamaño, si no es que hay error. Es un poco chapucero pero ...

Desconectado RDanielV

  • Me das tu IP?
  • *
  • Mensajes: 22
  • Sexo: Masculino
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Re:Forzar a fflush para que de error[C]
« Respuesta #4 en: Mayo 16, 2017, 05:17:07 pm »
Hola.
Debo reconocer que por momentos me cuesta bastante hacer que entiendan que es lo que no puedo hacer. -
La idea general es que antes un error el mensaje sea lo mas completo posible y como no puedo hacer que fflush falle desconozco que mensaje emitiría errno(en este caso), pero con tu sugerencia creo que se torna bastante completo, puedo emitir un mensaje diciendo que fue lo que fallo y además especificar si la frase fue grabada en el disco (que no es poca cosa), la idea es saber cuanto ocupa el archivo al comienzo y cuanto al finalizar, lo demás es obvio. -   
Te dejo un programita para que me digas si esta bien o hay una manera mejor para saber lo que ocupa un archivo.

Código: You are not allowed to view links. Register or Login
#include <stdio.h>
#include <stdlib.h>

int main ( int argc, char *argv[ ] ){
FILE *fich;
fich=fopen("archGuiaTel.txt","r");

fseek(fich, 0L, SEEK_END);
printf( "\n archGuiaTel.txt ocupa %ld bytes\n ", ftell(fich) );

fclose(fich);

return EXIT_SUCCESS;
}

Un abrazo.-

Desconectado .xAk.

  • el engendro
  • Moderador
  • *****
  • Mensajes: 7298
  • Sexo: Masculino
  • F0r3v3R NeWbI3
    • Ver Perfil
Re:Forzar a fflush para que de error[C]
« Respuesta #5 en: Mayo 17, 2017, 08:45:29 am »
Mírate: You are not allowed to view links. Register or Login

SaludOS


resuelto
Tº maximas para no forzar componentes

Iniciado por Whetmore

11 Respuestas
1746 Vistas
Último mensaje Octubre 30, 2009, 05:05:43 pm
por rgb90
xx
Como editar videos para forzar la descarga de un codec?

Iniciado por Mr Cucor

6 Respuestas
990 Vistas
Último mensaje Noviembre 05, 2010, 08:07:31 pm
por Mr Cucor
resuelto
[Solucionado] Forzar a "regedit" para aceptar clave de registro en Windows 7

Iniciado por racso34

8 Respuestas
3961 Vistas
Último mensaje Mayo 24, 2011, 09:19:00 am
por racso34
xx
Ver o Forzar descarga de Archivo .PDF

Iniciado por shevchenko

0 Respuestas
4990 Vistas
Último mensaje Julio 11, 2008, 09:34:23 am
por shevchenko
xx
Forzar descargas utilizando PHP

Iniciado por electro-ooz

0 Respuestas
2063 Vistas
Último mensaje ſeptiembre 27, 2005, 04:07:13 pm
por electro-ooz
xx
forzar la descarga de las dll de la memoria

Iniciado por WaesWaes

5 Respuestas
2411 Vistas
Último mensaje Enero 22, 2008, 04:23:39 pm
por WaesWaes
xx
Forzar descargas de archivos con PHP

Iniciado por shevchenko

1 Respuestas
2244 Vistas
Último mensaje Junio 11, 2008, 08:51:34 am
por isseu
xx
Forzar la Finalización y la Recolección de Basura en Java

Iniciado por shevchenko

1 Respuestas
2144 Vistas
Último mensaje Julio 21, 2008, 09:46:24 am
por kamui23
xx
Imagen para error 404

Iniciado por Crosslance

12 Respuestas
3812 Vistas
Último mensaje Abril 08, 2010, 04:11:23 pm
por BlackSwan[Xzp]
xx
Error al ejecutar STUB para encryptar

Iniciado por fantasy.17

1 Respuestas
716 Vistas
Último mensaje Junio 06, 2011, 05:58:15 am
por Kodeinfect