這是運行結果:

這是它的注冊賬戶的函式(輸入二進制檔案的函式):
void show1() {
//獲取初始化資訊
cout << "請輸入賬號:";
string acNumber;
cin >> acNumber;
cout << "請輸入用戶名:";
string name;
cin >> name;
cout << "請輸入身份證號:";
string id;
cin >> id;
cout << "請輸入地址:";
string addr;
cin >> addr;
cout << "請輸入存款金額:";
double sumOfMonney;
cin >> sumOfMonney;
//cout << "請設定賬戶密碼:";
string p;
p = getPassword();
//產生賬戶
Account newaccount(acNumber, id, name, addr, sumOfMonney, p);
//打開二進制檔案存盤賬戶
string fname = "storeInfo";
fstream fs(fname, ios::binary | ios::out);
if (!fs) {
cout << "存盤檔案打開失敗" << endl;
}
//acNumber
int len = newaccount.getAcNumber().length();
fs.write((char*)&len, sizeof(int));
fs.write(newaccount.getAcNumber().c_str(), len);
//id
len = newaccount.getID().length();
fs.write((char*)&len, sizeof(int));
fs.write(newaccount.getID().c_str(), len);
//name
len = newaccount.getName().length();
fs.write((char*)&len, sizeof(int));
fs.write(newaccount.getName().c_str(), len);
//addr
len = newaccount.getAddr().length();
fs.write((char*)&len, sizeof(int));
fs.write(newaccount.getAddr().c_str(), len);
//sumOfMonney
double s = newaccount.getSumOfMonney();
fs.write((char*)&s, sizeof(double));
//password
len = newaccount.getPassword().length();
fs.write((char*)&len, sizeof(int));
fs.write(newaccount.getPassword().c_str(), len);
//state
bool state = true;
fs.write((char*)&state, sizeof(bool));
//關閉檔案
fs.flush();
fs.close();
cout << "新建賬戶成功!" << endl;
}這是它的顯示用戶資訊的函式
//讀取賬戶資訊
void show2() {
//根據資訊索參考戶賬號
cout << "請輸入您的賬號:" << endl;
string num;
cin >> num;
fstream fs("storeInfo", ios::binary | ios::in);
if (!fs) {
cout << "讀取賬戶資訊失敗,請確保已建立賬戶。" << endl;
}
Account a;
//判斷檔案是否索引完畢
while (!fs.eof()) {
char buffer[100] = { 0 };
int len = 0;
//acNumber
fs.read((char*)&len, sizeof(int));
fs.read(buffer, len);
a.setAcNumber(buffer);
//id
fs.read((char*)&len, sizeof(int));
fs.read(buffer, len);
a.setID(buffer);
//name
fs.read((char*)&len, sizeof(int));
fs.read(buffer, len);
a.setName(buffer);
//addr
fs.read((char*)&len, sizeof(int));
fs.read(buffer, len);
a.setAddr(buffer);
//sumOfMonney
double monney = 0;
fs.read((char*)&monney, sizeof(double));
a.setSumOfMonney(monney);
//password
fs.read((char*)&len, sizeof(int));
fs.read(buffer, len);
a.setPassword(buffer);
//state
bool state =true;
fs.read((char*)&state, sizeof(bool));
fs.read(buffer, len);
a.setState(buffer);
//找到用戶賬號
if (a.getAcNumber() == num) {
//根據密碼保護用戶賬戶
for (int i = 0;i < 3;i++) {
cout << "請第" << i + 1 << "次輸入密碼(僅能輸入三次):";
string p;
p = getPassword();
//密碼輸入正確,顯示用戶資訊
if (p == a.getPassword()) {
a.showInfo();
fs.close();
return;
}
//輸入錯誤,還有輸入機會
else {
if (i < 2)
cout << "密碼錯誤,請重新輸入。" << endl;
}
}
//輸入次數用完,回到主選單
cout << "密碼不正確。";
return;
}
}
//未索引到該賬號
cout << "此賬戶不存在,請注冊" << endl;
}
uj5u.com熱心網友回復:
讀寫字串,最好要把長度資訊搞準確uj5u.com熱心網友回復:
怎么搞清楚呀,這邊都已經取了length 了,感覺最侄訓是要用char改回來。uj5u.com熱心網友回復:
學會單步除錯,看看讀出來的是什么?uj5u.com熱心網友回復:
是因為buffer開始讀取了一個長的,后面又讀取了短的,所以后面讀取的就會包含前面末尾那個值,每次讀新欄位的時候,memset一下
uj5u.com熱心網友回復:
怎么搞清楚呀,這邊都已經取了length 了,感覺最侄訓是要用char改回來。 讀寫字串,最好要把長度資訊搞準確
是因為buffer開始讀取了一個長的,后面又讀取了短的,所以后面讀取的就會包含前面末尾那個值,每次讀新欄位的時候,memset一下
因為read讀取的時候并不會在后面附加結束符
uj5u.com熱心網友回復:
怎么搞清楚呀,這邊都已經取了length 了,感覺最侄訓是要用char改回來。 讀寫字串,最好要把長度資訊搞準確
是因為buffer開始讀取了一個長的,后面又讀取了短的,所以后面讀取的就會包含前面末尾那個值,每次讀新欄位的時候,memset一下
因為read讀取的時候并不會在后面附加結束符
uj5u.com熱心網友回復:
學會單步除錯,看看讀出來的是什么?
uj5u.com熱心網友回復:
除錯的話主要是vs的二進制檔案除錯的時候讀出來的都是“燙燙燙燙”所以只能執行了。 學會單步除錯,看看讀出來的是什么?
讀取出來是燙燙,這是debug版特意賦值的,VC 會把未初始化的堆疊記憶體全部填成0xcc,當字串看就是 燙燙燙燙,0xcc也是除錯中斷指令,如果指令執行到這里,就會報錯,便于迅速發現bug。
不過,什么值也不會影響你去除錯。
uj5u.com熱心網友回復:
除錯的話主要是vs的二進制檔案除錯的時候讀出來的都是“燙燙燙燙”所以只能執行了。 學會單步除錯,看看讀出來的是什么?
讀取出來是燙燙,這是debug版特意賦值的,VC 會把未初始化的堆疊記憶體全部填成0xcc,當字串看就是 燙燙燙燙,0xcc也是除錯中斷指令,如果指令執行到這里,就會報錯,便于迅速發現bug。
不過,什么值也不會影響你去除錯。
uj5u.com熱心網友回復:
除錯的話主要是vs的二進制檔案除錯的時候讀出來的都是“燙燙燙燙”所以只能執行了。 學會單步除錯,看看讀出來的是什么?
讀取出來是燙燙,這是debug版特意賦值的,VC 會把未初始化的堆疊記憶體全部填成0xcc,當字串看就是 燙燙燙燙,0xcc也是除錯中斷指令,如果指令執行到這里,就會報錯,便于迅速發現bug。
不過,什么值也不會影響你去除錯。
uj5u.com熱心網友回復:
那debug 是一讀取到二進制檔案里的字串就會報錯嗎。 除錯的話主要是vs的二進制檔案除錯的時候讀出來的都是“燙燙燙燙”所以只能執行了。 學會單步除錯,看看讀出來的是什么?
讀取出來是燙燙,這是debug版特意賦值的,VC 會把未初始化的堆疊記憶體全部填成0xcc,當字串看就是 燙燙燙燙,0xcc也是除錯中斷指令,如果指令執行到這里,就會報錯,便于迅速發現bug。
不過,什么值也不會影響你去除錯。
當然不是了。報錯指的是去存取非法記憶體的時候才會報錯。讀二級制檔案和讀文本檔案一樣。沒有什么特殊的。
uj5u.com熱心網友回復:
那debug 是一讀取到二進制檔案里的字串就會報錯嗎。 除錯的話主要是vs的二進制檔案除錯的時候讀出來的都是“燙燙燙燙”所以只能執行了。 學會單步除錯,看看讀出來的是什么?
讀取出來是燙燙,這是debug版特意賦值的,VC 會把未初始化的堆疊記憶體全部填成0xcc,當字串看就是 燙燙燙燙,0xcc也是除錯中斷指令,如果指令執行到這里,就會報錯,便于迅速發現bug。
不過,什么值也不會影響你去除錯。
當然不是了。報錯指的是去存取非法記憶體的時候才會報錯。讀二級制檔案和讀文本檔案一樣。沒有什么特殊的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59032.html
標籤:新手樂園
