2011-11-30 34 views
7
#include <iostream> 
#include <fstream> 

using namespace std; 

class info { 

private: 
    char name[15]; 
    char surname[15]; 
    int age; 
public: 
    void input(){ 
     cout<<"Your name:"<<endl; 
      cin.getline(name,15); 
     cout<<"Your surname:"<<endl; 
     cin.getline(surname,15); 
     cout<<"Your age:"<<endl; 
     cin>>age; 
     to_file(name,surname,age); 
    } 

    void to_file(char name[15], char surname[15], int age){ 
     fstream File ("example.bin", ios::out | ios::binary | ios::app); 
    // I doesn't know how to fill all variables(name,surname,age) in 1 variable (memblock) 
     //example File.write (memory_block, size); 

File.close(); 
    } 

}; 

int main(){ 

info ob; 
ob.input(); 

return 0; 
} 

No sé cómo escribir más de 1 variable en un archivo, por favor ayuda, he incluido un ejemplo;) Tal vez hay mejores formas de escribir en un archivo, ayúdenme con esto, me cuesta mucho resolverlo.escribiendo en archivos binarios

+2

fuera de tema a su pregunta, pero si se llama 'ob.input()' más de una vez, descubrirá un error en tu código de entrada. Intente agregar 'std :: cin.ignore (100, '\ n');' después de 'cin >> age'. –

Respuesta

15

Para un archivo de texto , fácilmente se podría salida de una variable por línea usando un << similares a la que utiliza con std::cout.

Para un archivo binario, necesita utilizar std::ostream::write(), que escribe una secuencia de bytes. Para su atributo age, necesitará reinterpret_cast para const char* y escribir tantos bytes como sea necesario para mantener un int para la arquitectura de su máquina. Tenga en cuenta que si tiene la intención de leer esta fecha binaria en una máquina diferente, deberá tener en cuenta word size y endianness. También le recomiendo que ponga a cero los almacenamientos intermedios name y surname antes de usarlos para no terminar con artefactos de memoria no inicializada en su archivo binario.

Además, no es necesario pasar atributos de la clase al método to_file().

#include <cstring> 
#include <fstream> 
#include <iostream> 

class info 
{ 
private: 
    char name[15]; 
    char surname[15]; 
    int age; 

public: 
    info() 
     :name() 
     ,surname() 
     ,age(0) 
    { 
     memset(name, 0, sizeof name); 
     memset(surname, 0, sizeof surname); 
    } 

    void input() 
    { 
     std::cout << "Your name:" << std::endl; 
     std::cin.getline(name, 15); 

     std::cout << "Your surname:" << std::endl; 
     std::cin.getline(surname, 15); 

     std::cout << "Your age:" << std::endl; 
     std::cin >> age; 

     to_file(); 
    } 

    void to_file() 
    { 
     std::ofstream fs("example.bin", std::ios::out | std::ios::binary | std::ios::app); 
     fs.write(name, sizeof name); 
     fs.write(surname, sizeof surname); 
     fs.write(reinterpret_cast<const char*>(&age), sizeof age); 
     fs.close(); 
    } 
}; 

int main() 
{ 
    info ob; 
    ob.input(); 
} 

Un archivo de datos de la muestra puede tener este aspecto:

% xxd example.bin 
0000000: 7573 6572 0000 0000 0000 0000 0000 0031 user...........1 
0000010: 3036 3938 3734 0000 0000 0000 0000 2f00 069874......../. 
0000020: 0000          .. 
+0

gracias! Quizás esté un poco fuera de alcance, pero ¿qué herramientas hay para inspeccionar los archivos binarios? –

+0

@MinhTran: Sí, esa es una nueva pregunta. Tal vez eche un vistazo a https://stackoverflow.com/tags/xxd/info? – Johnsyweb

5
File.write(name, 15); 
File.write(surname, 15); 
File.write((char *) &age, sizeof(age)); 
+0

Si tengo más de 1 variable int, por ejemplo 'char name [15]; \t apellido de char [15]; \t int edad, teléfono; 'when wite' File.write (name, 15); File.write (apellido, 15); File.write ((char *) & age & phone, sizeof (age & phone)); '?? – Wizard

+0

@ user1069874: no, no puede conectarlos así, debe escribirlos por separado: 'File.write (name, 15); File.write (apellido, 15); File.write ((char *) & age, sizeof (age)); File.write ((char *) & phone, sizeof (phone)); ' – Dani

+0

quizás sea mejor' File.write ((char *) this, sizeof (info)); '? – Wizard