返回列表 發帖

[軟體] C++遇到寫入輸出問題

小弟最近無聊寫了一個寫入輸出文字檔的程式
發現如果寫入後不關閉程式,直接在讀取會讀取資料兩次
在寫入讀取會變成三次~~但資料並沒有出錯....
雖然想過用指標好像可以解決~~但有沒有其他方法阿?

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
class person
{private :
string name;
double hight;
double weight;
bool sex;
public :
person(string n,double h,double w,bool s);
string getName(){return name;};
double getHight(){return hight;};
double getWeight(){return weight;};
bool getSex(){return sex;};
void setName(string n){name=n;};
void setHight(double h){hight=h;};
void setWeight(double w){weight=w;};
void setSex(bool s){sex=s;};
person (){};//為何一定要這行,否則第42行無法執行
void output();};
void person::output()
{
        cout << name << "        " << hight << "        " << weight << "        "<< sex << "        " <<endl;
        if (sex)
                cout << "boy" << endl;
        else
                cout << "girl" << endl;
}
person::person(string n,double h,double w,bool s)
{        name=n;
        hight=h;
        weight=w;
        sex=s;   }  
int main()
{
    vector<person> list;
        person temp;   
        string n;
        double h,w;
        bool s;
    int z,i;
do//程式起點
    {
    cout<<"1.新增資料
2.修改資料
3.刪除資料
4.將資料存入檔案
5.將資料由檔案中讀出
6.結束程式
請輸入選項:"<<endl;
    cin>> z;
    switch(z)
{
    case 1://如何將功能1的資料傳給功能2.3.4,並資料加入功能5中讀出的資料?
{
        char sel;
        do
        {
                cout << "請輸入姓名、身高、體重及性別:";
                cin >> n >> h >> w >> s;
                temp = person(n,h,w,s);
                list.push_back(temp);
                cout << "是否繼續輸入:";
                cin >> sel;
        }while (sel=='y');       
        for (i=0;i<list.size();i++)
        {
                cout << i << "        ";
                list.output();//為何輸出時會出現布林變數1,再出現BOY?
        }
}
break;
    case 2://如何將功能1.5的資料修改,並傳給功能3
{
    person file(n,h,w,s);
        int l;
        char sel;
    for (i=0;i<list.size();i++)
        {
                cout << i << "        ";
                list.output();
        }
   
        cout << "請問要修改第幾筆資料:";
        cin >> i;
    do
{                  
    cout << "1.修改名稱
";
        cout << "2.修改身高
";
        cout << "3.修改體重
";
        cout << "4.修改性別
";
        cin >> l;
        switch (l)
{
        case 1:
                cout << "目前名稱是:" <<  list.getName();
                cout << "修改成:";
                cin >> n;
            list.setName(n);
                break;
        case 2:
                cout << "目前身高是:" <<  list.getHight();
                cout << "修改成:";
                cin >> h;
            list.setHight(h);
                break;
        case 3:
                cout << "目前體重是:" <<  list.getWeight();
                cout << "修改成:";
                cin >> w;
            list.setWeight(w);
                break;
        case 4:
         cout<<"目前性別是:" <<  list.getSex();
         cout << "修改成:";
         cin >>s;
         list.setSex(s);
         break;

        }       
        list.output();
        cout<<"是否繼續執行?";
        cin>> sel;
}while (sel=='y');
}
break;
    case 3://如何完成功能1.2.3.5的應用
{
    for (i=0;i<list.size();i++)
        {
                cout << i << "        ";
                list.output();
        }
    cout << "請問要刪除第幾筆資料:";
        cin >> i;
        list.erase(list.begin()+i);
        for (i=0;i<list.size();i++)
        {
                cout << i << "        ";
                list.output();
        }
}
break;
    case 4://如何將功能1.2.3.5的資料移入功能4,再將它存取 ;將全域變數寫入資料會無限寫入最後一筆資料
{
    char file[10];
    cout <<"請輸入檔案名稱:"<<endl;
    cin >> file;
    ofstream fout(file);
for (i=0;i<list.size();i++)
        {
         fout << list.getName() <<"        "<<list.getHight() <<"        "<<list.getWeight() <<"        "<<list.getSex() <<"        "<<endl;               
}
}
break;
    case 5://如何將功能5的資料傳給功能1.2.3?
{//功能4運行完再讀取相同檔案資料會重複讀取
    char file[10];
    cout <<"請輸入檔案名稱:"<<endl;
    cin >> file;
    ifstream fin(file);
    if (fin.fail())
    {cout << "file open failed
";}
        while(fin>>n)
        {
                 fin >> h >> w >> s;
                 list.push_back(person(n,h,w,s));
     }
     for (i=0;i<list.size();i++)
         list.output();
}
break;
    case 6:
         exit (0);
break;
}
    }while(1);//如果功能1的性別錯誤如何避免無限迴圈?
    system("pause");
    return 0;
}

也許你可以先試著用用看debug的單步執行
試著追蹤自己的程式看看
當然要用眼睛追蹤也不反對
透過這種方式發現的問題可以大幅降低以後再犯的機率

TOP

wwwwwwwwwwwwww
(我是注音文~)
一次問這麼多問題,讓人提不起勁回答....(本來我也只是想看看而已  ..(小聲說
簡單來說:
>> person (){};//為何一定要這行,否則第42行無法執行
因為person temp;你又沒給他引數,找不到相符的建構式當能不能跑

>>case 1://如何將功能1的資料傳給功能2.3.4,並資料加入功能5中讀出的資料?
CASE系列的問題基本上都是一樣的,你都已經有vector<person> list,何不好好利用他,還要另外去傳遞整筆資料呢?
如果是我我會以一個index來做來當中介,當功能一執行完後,就能知道該筆資料是list中的第幾筆,也就知道了該筆資料的index。之後要處理該筆資料就直接用index。舉例來說,就是我之前已經存了兩筆資料,現在使用功能一新增一筆,則該筆資料為第三筆。那我要使用功能二,那就我跟功能二說,請修改第三筆資料這樣。所以功能在設計上應該還是要每個"功能"都要寫成函式,然後分別以有引數與沒引數兩種情形來處理。如果要增加效能,不想花時間以index來搜尋資料的話,可以用傳址(call by address)或傳參考,把instance of person的address交給功能來處理。(不過刪除的話就不能這樣做了XD,還是要用index)

>>case 5://功能4運行完再讀取相同檔案資料會重複讀取
這個原因很簡單,因為你沒有清空list 阿wwwwwwwwwwwwwwww
變數沒初始化,當然同樣的資料再push進去就變兩倍@@,然後三倍.....

>>//為何輸出時會出現布林變數1,再出現BOY?
樓下寫了

>>//如果功能1的性別錯誤如何避免無限迴圈?
以下是猜測
不要用cin(cin >> n >> h >> w >> s;),改用其他IO函式
簡單一點的方法,也許你可以試試看不要把性別放最後面,或許身高體重放後面就好了?
因為看起來while中間都還有cin擋住,感覺無限迴圈應該不會出現才對?

以上,是不負責任的說明XD。程式的寫法有很多,上面都是本人的看法而已,自己多嘗試不同寫法也許能玩出更多趣味?!

[ 本文最後由 愛斯美若達 於 2010-5-12 16:37 編輯 ]

TOP

>>//為何輸出時會出現布林變數1,再出現BOY?
cout << name << "        " << hight << "        " << weight << "        "<< sex << "        " <<endl;

這邊不是先cout了 sex, 下面才cout BOY嗎?

開檔關檔的部分看得頭昏眼花, 交給下一位有緣人 XD

TOP

(以下文章內容只有威望大於等於 0 的才能瀏覽)

1

評分人數

TOP

返回列表