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

[SOLUCIONADO] Escribir en fichero

Estas en el tema de Escribir en fichero en el foro de C/C++ en Foros del Web. Buenas, hace mucho que no programo en C y he vuelto a las andadas. Estoy intentando insertar una cadena de texto en un fichero de ...
  #1 (permalink)  
Antiguo 20/08/2015, 13:54
 
Fecha de Ingreso: enero-2011
Mensajes: 13
Antigüedad: 13 años, 3 meses
Puntos: 0
Pregunta Escribir en fichero

Buenas, hace mucho que no programo en C y he vuelto a las andadas. Estoy intentando insertar una cadena de texto en un fichero de texto, pero parece ser que la codificación no la hace bien, no recuerdo como se trabajaba con estas cosas, por lo que no encuentro el fallo por mucho que busque en internet. Os pongo el código y el resultado.

Código:
#include "RCSwitch.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>     
     
RCSwitch mySwitch;

using namespace std; 


int main(int argc, char *argv[]) {

        // Lineas propias
        FILE *fp;
        fp=fopen("/home/pi/historial.txt", "r+b");
        string accion;
  
     // This pin is not the first pin on the RPi GPIO header!
     // Consult https://projects.drogon.net/raspberry-pi/wiringpi/pins/
     // for more information.
     int PIN = 2;
     
     if(wiringPiSetup() == -1)
       return 0;

     mySwitch = RCSwitch();
     mySwitch.enableReceive(PIN);  // Receiver on inerrupt 0 => that is pin #2
     
    
     while(1) {
  
      if (mySwitch.available()) {
    
        int value = mySwitch.getReceivedValue();
        if (value == 0) {
          printf("Unknown encoding\n");
        } else {    
   
          printf("Received %i\n", mySwitch.getReceivedValue() );

                if (value == 3131){
                        accion = "Encender luz dormitorio";}
        }

        fseek (fp, 0, SEEK_END);
        fwrite(&accion, sizeof(string), accion.length(), fp);
    
        mySwitch.resetAvailable();
    
      }
      
  
  }
  fclose(fp);
  exit(0);     


}
Simplemente debería añadir al final del fichero Encender luz dormitorio, pero en su lugar me muestra este resultado:
Código:
R-ÿÿÿÿÿÿÿÿ^
KÚ¶;
   P-èȶ0Ú¶äø©¾¨¥øŠR-ÿÿÿÿÿÿÿÿ^
KÚ¶;
   P-èȶ0Ú¶äø©¾¨¥øŠpi@raspberrypi:~$
  #2 (permalink)  
Antiguo 21/08/2015, 02:24
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Escribir en fichero

Hola:

Yo de C no sé mucho, pero si vas a usar C con string, puedes intentarlo así:
Código C:
Ver original
  1. int main(int argc, char *argv[])
  2. {  
  3.     FILE *fp;
  4.     fp=fopen("historial.txt", "w");
  5.     string accion = "Encender luz dormitorio";
  6.     fwrite(&accion.front(), sizeof(char), accion.length(), fp);
  7.  
  8.     fclose(fp);
  9.     return 0;
  10. }

Los fallos que yo te veo:

Primero que tienes que poner el puntero FILE en modo escritura, no en lectura.

Y luego, has de darle el inicio del string, para eso hay una función que te posiciona y devuelve el primer elemento del string.

Luego, lo que estás almacenando, son char, que son los elementos de los que se compone el string, por eso el segundo parametro es sizeof(char)

A ver si esto te sirve
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 21/08/2015, 02:33
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Escribir en fichero

Añado que esto:

Código C:
Ver original
  1. accion.front()

es igual que esto
Código C:
Ver original
  1. accion[0]

que en definitiva es buscar el primer índice del array, pero entiendo que lo correcto es usar los métodos proporcionados.
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 24/08/2015, 02:36
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Escribir en fichero

Cita:
Iniciado por dehm Ver Mensaje
...que en definitiva es buscar el primer índice del array, pero entiendo que lo correcto es usar los métodos proporcionados.
accion[0] está llamando al operador de indización "char& string::operator[](size_t)" por lo que también estás llamando a uno de los métodos proporcionados por la clase string.

No hay que perder de vista que en las clases únicamente se va a poder acceder al contenido accediendo a métodos proporcionados por la propia clase. Ten en cuenta que estoy presuponiendo que una clase DEBERÍA tener todas las variables en la parte privada.

Cita:
Iniciado por xD_avid Ver Mensaje
Estoy intentando insertar una cadena de texto en un fichero de texto, pero parece ser que la codificación no la hace bien, no recuerdo como se trabajaba con estas cosas, por lo que no encuentro el fallo por mucho que busque en internet.
El problema que tienes es que la clase string utiliza internamente un puntero para almacenar la cadena... cuando llamas a fwrite (que es una función de C y no entiende de clases) le estás pasando la posición de memoria donde se encuentra la instancia de "string"... y vuelcas ese contenido al fichero. El problema es que en la posición de memoria de string vas a encontrarte un puntero y algunas variables auxiliares pero no el contenido del string, que es lo que pretendes guardar... al final estás volcando al fichero un contenido que no tiene nada que ver con lo esperado.

En la respuesta que te proporciona dehm, lo que hace es pasar a fwrite la dirección de memoria donde se guarda la cadena, con lo que fwrite será capaz de guardar la cadena en el fichero.

Hay otras formas de acceder a dicho puntero, en el caso del string puede parecer redundante... pero esto es así porque hay varios tipos de contenedores en C++ y la idea era que todos se pudiesen utilizar de forma más o menos genérica.

quizás para el tipo string, la forma más "correcta" de acceder al puntero interno sea mediante el método "c_str()".

  • front() y begin() se usan para gestionar el string como si fuese una lista de caracteres.
  • cadena[0] tiene como finalidad acceder a elementos concretos del string, para comprobar su valor o modificarlo
  • c_str() te devuelve un puntero al inicio de la cadena
  • at() es similar a cadena[0]. La diferencia entre ambos es que "at" lanza una excepción si se intenta acceder a posiciones no válidas
Un saludo

Última edición por eferion; 24/08/2015 a las 02:45
  #5 (permalink)  
Antiguo 30/08/2015, 19:19
 
Fecha de Ingreso: enero-2011
Mensajes: 13
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Escribir en fichero

Perdonar la demora en contestar, pero he estado liado.

He hecho lo que me habéis dicho y me ha funcionado perfecto, os lo agradezco a todos por la ayuda y sobre todo por darme tanta información, he aprendido cosas nuevas, os lo agradezco mucho!!

Etiquetas: char, fichero, int, string
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 09:44.