/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema al escribir un archivo

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
llsnm



Registrado: 29 Dic 2011
Mensajes: 1

MensajePublicado: 29/12/2011 11:34 pm
Título: Problema al escribir un archivo

Hola y gracias por interesarte en el post,

estoy escribiendo un código que básicamente cuenta las cantidades de reiniciadas o apagadas al s.o y las escribe en un archivo de texto. Hice que se auto inicie con windows modificando el registro.

El problema es que al reiniciar o apagar, no vuelve a escribir el archivo. El programa se auto inicia y las funciones que utilice no devuelven ningún error, pero aun así no escribe el archivo.

El código:
Código:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//------------------------------------------------------------------------------
int s(void);
int c(void);
//------------------------------------------------------------------------------
int main(int argc, char *argv[]){
 
 if(s()== 0) return 0;
 if(c()== 0) return 0;
 
 while(1){Sleep(100);} // para ver el return de las funciones: sacar.
 
 return 1;
}
//------------------------------------------------------------------------------
int s(void)
{
   HKEY hkey;
 
   const char PATH[] =
   "C:\\Users\\User1\\Desktop\\reboot.exe"; // por ahora al escritorio.
 
   
   int regResult=RegOpenKeyEx(HKEY_CURRENT_USER/*HKEY_LOCAL_MACHINE*/,
   "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&hkey);
   if(regResult != 0) /*return 0;*/ printf("REG OPEN ERROR\n");
 
   regResult=RegSetValueEx(hkey,"count",0,REG_SZ,(BYTE *)PATH,
   strlen(PATH));
   if(regResult != 0) /*return 0;*/printf("REG SET ERROR\n");
   
   regResult=RegCloseKey(hkey);
   if(regResult != 0) /*return 0;*/printf("REG CLOSE ERROR\n");
   return 1;
}
//------------------------------------------------------------------------------
int c(){
      FILE *counter;
     
      counter=fopen("filecounter.txt","a");
      if(counter==NULL) /*return 0;*/ printf("FILE OPEN ERROR\n");
     
      int check=fprintf(counter,"hola\n");
      if (check==0) /*return 0;*/ printf("FPRINTF ERROR\n");
     
      //int check = fputs("hello\n",counter);                      // tampoco anda
      //if (check!=0) return 0; // printf("FPUTS ERROR\n");
     
      if(fclose(counter)!= 0) /*return 0;*/ printf("FCLOSE ERROR\n");
     
      return 1;
}
//------------------------------------------------------------------------------


Alguna sugerencia?

PD: Aun no escribí la parte de contar los reinicios, pero una vez que pueda escribir el file después de reiniciar no va a ser mucho problema.

PD2: compilador Dev-C++ 4.9.9.2 en windows 7 ultimate
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 290
Ubicación: MICA S.A.

MensajePublicado: 30/12/2011 8:57 am
Título:

Hola,

La idea de tu programa es muy interesante, pero tiene el defecto de ser de consola.

Si lo planteases con una interfaz gráfica sería realizable, pero como lo planteas tú, estás abocado al fracaso (según mi modesta opinión).

El problema es cómo respondes a WM_QUERYENDSESSION y a WM_ENDSESSION sin una función de ventana.

No obstante, sería interesante hacer un programa parecido que mantuviese un registro del tiempo que está encendido un ordenador, mostrase gráficos y estadísticas. Tal vez para el futuro...

Un saludo.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
Yahoo Messenger
cheroky



Registrado: 22 Sep 2005
Mensajes: 2479
Ubicación: Valladolid (España)

MensajePublicado: 30/12/2011 12:21 pm
Título:

Hola.

Tal vez te pueda ayudar el siguiente hilo: Residente en Visual C++


·?0ƒ·
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 30/12/2011 1:54 pm
Título:

Hay algunos detalles que no se ven bien en el programa.

Para empezar deberías cambiar la definición de la función principal si no vas a procesar los argumentos pasados mediante la linea de comandos y dar nombres descriptivos a las funciones.

Y la convención es retornar 0 (o NULL según el caso) si la función falla o algún valor útil si no ocurren errores.

----

En la función donde agregas la clave utilizas la función RegOpenKeyEx.

A tener en consideración:
1) El valor de retorno si todo va bien es ERROR_SUCCESS.
2) Como indica su documentación:
Cita:
Unlike the RegCreateKeyEx function, the RegOpenKeyEx function does not create the specified key if the key does not exist in the registry.


Ya que los pasos que realizas son:
1) Abrir (no crear) la clave.
2) Ajustar su valor.
3) Cerrar la clave.
Hay que corregirlo utilizando la otra función (RegCreateKeyEx).

Un programa de ejemplo con sus detallitos pero que funciona correctamente en MS Windows XP es:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define NOM_PROG  "C:\\rir3760\\Devel\\User\\C\\Temp\\main.exe"
#define NOM_DATA  "C:\\rir3760\\Devel\\User\\C\\Temp\\data.txt"

int agregar_clave(void);
int abrir_archivo(void);

int main(void)
{
   if (!agregar_clave()){
      puts("Error al crear la clave!");
      return EXIT_FAILURE;
   }else if (!abrir_archivo()){
      puts("Error al procesar el archivo!");
      return EXIT_FAILURE;
   }
   
   return EXIT_SUCCESS;
}

int agregar_clave(void)
{
   LONG rv;
   HKEY hkResult;
   DWORD dwDisposition;
   
   rv = RegCreateKeyEx(
      HKEY_CURRENT_USER,
      "Software\\Microsoft\\Windows\\CurrentVersion\\Run",
      0,
      NULL,
      REG_OPTION_NON_VOLATILE,
      KEY_ALL_ACCESS,
      NULL,
      &hkResult,
      &dwDisposition
   );
   if (rv != ERROR_SUCCESS)
      return 0;
   
   rv = RegSetValueEx(
      hkResult,
      "Count",
      0,
      REG_SZ,
      (LPCVOID) NOM_PROG,
      sizeof NOM_PROG
   );
   if (rv != ERROR_SUCCESS)
      return 0;
   
   if ((rv = RegCloseKey(hkResult)) != ERROR_SUCCESS)
      return 0;
   
   return 1;
}

int abrir_archivo(void)
{
   FILE *archivo;
   int contador;
   
   /* No es lo mejor, ni de lejos ... */
   
   contador = 0;
   if ((archivo = fopen(NOM_DATA, "rt")) != NULL){
      fscanf(archivo, "%d", &contador);
      fclose(archivo);
   }
   
   contador++;
   if ((archivo = fopen(NOM_DATA, "wt")) == NULL)
      return 0;
   else {
      fprintf(archivo, "%d\n", contador);
      fclose(archivo);
   }
   
   return 1;
}


Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com