2011-11-30 205 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; 
} 

我不知道如何寫一個以上的變量到一個文件,請幫助,我包括一個例子;)也許有更好的方法寫入文件,請幫助我這對我來說很難解決。寫入二進制文件

+2

題外話你的問題,但如果你調用'ob.input()'不止一次,你會發現一個bug在你的輸入代碼中。嘗試在'cin >> age'之後添加'std :: cin.ignore(100,'\ n');''。 –

回答

15

對於文本文件,你可以每行輕鬆輸出一個變量使用類似<<給您std::cout使用的。

對於二進制文件,您需要使用std::ostream::write(),它會寫入一個字節序列。對於你的age屬性,你需要reinterpret_cast這個到const char*並且寫出儘可能多的字節來保存你機器結構的int。請注意,如果您打算在另一臺計算機上讀取此二進制日期,則必須考慮word sizeendianness。我還建議您在使用它們之前將namesurname緩衝區置零,以免最終在二進制文件中產生未初始化內存的人爲影響。

此外,不需要將該類的屬性傳遞給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(); 
} 

採樣數據文件可能是這樣的:

% 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

謝謝!也許這有點超出範圍,但有什麼工具來檢查二進制文件? –

+0

@MinhTran:是的,這是一個新問題。也許看看https://stackoverflow.com/tags/xxd/info? – Johnsyweb

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

如果我有超過1個int變量,例如'char name [15]; \t char姓氏[15]; \t int age,phone;'when wite'File.write(name,15); File.write(姓氏,15); File.write((char *)&age&phone,sizeof(age&phone));'?? – Wizard

+0

@ user1069874:不,你不能像這樣連接它們,你必須單獨寫它們:'File.write(name,15); File.write(姓氏,15); File.write((char *)&age,sizeof(age)); File.write((char *)&phone,sizeof(phone));' – Dani

+0

也許更好'File.write((char *)this,sizeof(info));'? – Wizard