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

[SOLUCIONADO] fwrite C mejor que write en C++?

Estas en el tema de fwrite C mejor que write en C++? en el foro de C/C++ en Foros del Web. Hola compañeros jajaj, no os voy a dar descanso ¿Que tal entan? Bueno... a ver como os explico. tengo una estructura en un archivo en ...
  #1 (permalink)  
Antiguo 20/07/2016, 16:02
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Pregunta fwrite C mejor que write en C++?

Hola compañeros jajaj, no os voy a dar descanso
¿Que tal entan?

Bueno... a ver como os explico. tengo una estructura en un archivo en C++ que quiero enviar a un fichero 3 veces(con datos diferentes). Hasta aquí todo ok.
Adjunto el código.
Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. struct Dados {
  6.     char c;
  7.     char frase[10];
  8.     int n;
  9. } dados;
  10.  
  11. int main () {
  12.     ofstream fin;
  13.     fin.open ( "prova.dat", std::fstream::out | std::fstream::binary );
  14.    
  15.    
  16.     Dados d1 = {'a', "frase1", 64};
  17.     Dados d2 = {'b', "frase2", 65};
  18.     Dados d3 = {'c', "frase3", 66};
  19.     fin.write ( reinterpret_cast<const char*> ( &d1 ), sizeof ( dados ) );
  20.     fin.write ( reinterpret_cast<const char*> ( &d2 ), sizeof ( dados ) );
  21.     fin.write ( reinterpret_cast<const char*> ( &d3 ), sizeof ( dados ) );
  22.    
  23.    
  24.     fin.close();
  25.     return 0;
  26. }

El problema pasa por ejemplo a la hora de alterar esos datos. Mire ese otro ejemplo. ¿Debería alterar el primer registro no? Al menos eso es lo que quiero.
Vea el código que altera en C++.
Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. struct Dados {
  6.     char c;
  7.     char frase[10];
  8.     int n;
  9. } dados;
  10.  
  11. int main () {
  12.     ofstream fin;
  13.     fin.open ( "prova.dat", std::fstream::out | std::fstream::binary );
  14.    
  15.     Dados d4 = {'x', "mudado", 97};
  16.     fin.write ( (char *)&d4, sizeof ( dados ) );
  17.    
  18.     fin.close();
  19.     return 0;
  20. }

En ese caso lo que pasa es que se borra todo el contenido del fichero y se graba 'x', "mudado", 97. Pero con el "mismo" código en C todo funciona "bien", no sé cual es la causa.

Aquí el "mismo" código en C. Pongo mismo entre "" porque no sé que hago mal.
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. typedef struct Dados {
  4.     char c;
  5.     char frase[10];
  6.     int n;
  7. } dados;
  8.  
  9. int main() {
  10.     FILE *file;
  11.     file = fopen ( "prova.dat", "rb+" );
  12.    
  13.     dados d4 = {'x', "mudado", 97};
  14.     fwrite ( (char *)&d4, 1, sizeof(dados), file );
  15.  
  16.     fclose ( file );
  17.    
  18.     return 0;
  19. }

¿Alguien sabe decir que es lo que pasa porque con uno puedo y con otro no?

Gracias de antemano.
  #2 (permalink)  
Antiguo 20/07/2016, 16:46
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: fwrite C mejor que write en C++?

No es exactamente los mismo que lo de C (en C seria "wb"), al abrir un archivo con únicamente el flag fstream::out y no tener el fstream::in ya que si el archivo existe se borrará, lo que en realidad quieres hacer es abir un fstream con los flags in, out y binary en el segundo ejemplo y funcionará correctamente.

Aquí te dejo una referencia que relaciona y explica brevemente la relación entre los flags de C y los flags de C++

http://en.cppreference.com/w/cpp/io/basic_filebuf/open
  #3 (permalink)  
Antiguo 20/07/2016, 16:57
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: fwrite C mejor que write en C++?

ok xKuZz ¡Gracias!
La verdad no se por qué no probé usar ambos flags juntos, me pareció disparatado y por eso no lo hice.

Voy a dar una mirada a eso que dices. ¡Gracias nuevamente! Me salvaste jejej

Etiquetas: ficheros, fwrite, write
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 23:29.