2011-08-21 71 views
1

我試圖從一個文件逐字讀取並將其存儲在cpp中相應的數組中。我在執行它時遇到問題。你們能幫我找到問題嗎?這是我的代碼從cpp文件中逐字讀取


void Read_file() 
{ 
    int i=1; 

    ifstream in_file("cust_details1.txt"); 
    if(in_file.is_open()) 
    { 
    cout<<"List of all bills:\n"<&ltendl; 
    while(in_file){ 
     cout<<"here"; 
     in_file >> ac_no[i]; 
     in_file >> ac_name[i]; 
     in_file >> ac_amount[i]; 
     in_file >> ac_emi[i]; 
     in_file >> ac_sanc[i]; 
     cout<<"Accout no = "<&ltac_no[i]<<" Name = "<&ltac_name[i]<<" Amount = "<&ltac_amount[i]<<" Emi = "<&ltac_emi[i]<<" Sanction = "<&ltac_sanc[i] <&ltendl; 
     i++; 
     cout<<"----------------------------------------------------"<&ltendl; 
    } 
    in_file.close(); 
    tot=i; 
    } 
    cout<<"Exiting"<&ltendl; 
} 

這段代碼在第一次循環時執行得很好。即第一組記錄被存儲在陣列中。當循環進行第二次時,它會遇到seg故障。 here未被第二次打印。所有的聲明都是正確的。

Declarations: 
string ac_name[30]; 
int ac_no[30]; 
string ac_sanc[2]; // it will hold only y or n 
float ac_emi[30]; 
int ac_amount[30]; 
+0

ac_no,ac_name等在哪裏被初始化,它被初始化爲什麼? – arunkumar

+1

是否是條件檢查操作?我不知道ifstream當他們到達EOF時自己調零...? (可能會更好/更清晰地使用'while(in_file.good())') – bcr

+0

對不起guyz,prob被解決了。這是一個愚蠢的錯誤,正如'Anteru'所指出的那樣。 – CHID

回答

3

while循環應該是這樣的:

while(in_file >> ac_no[i] && 
     in_file >> ac_name[i] && 
     in_file >> ac_amount[i] && 
     in_file >> ac_emi[i] && 
     in_file >> ac_sanc[i]) 

    cout<<"Accout no = "<<ac_no[i]<<" Name = "<<ac_name[i]<<" Amount = "<<ac_amount[i]<<" Emi = "<<ac_emi[i]<<" Sanction = "<<ac_sanc[i]<<endl; 
    i++; 
} 

這種循環確保如果在文件中的任何錯誤,它就會停止閱讀。

順便說一句,每個數組的大小應該足夠大,以保存文件中的所有值。您已聲明每個數組的大小爲30,但string ac_sanc[2]除外。爲什麼ac_sanc的尺寸只有2?你知道這意味着什麼嗎?這意味着ac_sanc[i]將針對i >=2調用未定義的行爲。你的程序可能(也很可能會)崩潰。另外,如果它只能是yn,那你爲什麼不把它聲明爲char數組?

由於您使用C++,我建議你定義一個結構,並使用std::vector如下:

#include <string> 
#include <vector> 

struct Account 
{ 
    std::string ac_name; 
    int   ac_no; 
    char  ac_sanc; 
    float  ac_emi; 
    int   ac_amount; 
}; 

std::vector<Account> accounts; 
Account ac; 

while(in_file >> ac.ac_no && 
     in_file >> ac.ac_name && 
     in_file >> ac.ac_amount && 
     in_file >> ac.ac_emi && 
     in_file >> ac.ac_sanc) 

    accounts.push_back(ac); 
    //... 
    //you may use 'ac' to print each values 
} 
+2

很棒..改變了我的循環檢查方式.. – CHID

1

你寫入在第一循環的第二個元素(ac_no[1],而不是ac_no[0]。)如果你的數組的大小爲2,那麼這或許可以解釋爲什麼它崩潰。

如果你不能控制輸入,你應該使用std::vectorpush_back或至少檢查i < arraySize是否會發現這樣的錯誤。

+0

非常感謝你.. dint'通知ac_sanc [2]'。它的工作 – CHID

+0

又名。所有CHID的陣列指標都是一個,是嗎? – bcr

+0

是的。我故意從1開始 – CHID

1

有你的代碼的幾個問題。

while(in_file) 

當你到達終點或有錯誤不會失敗,而是更喜歡:

while(in_file.good()) 

下一頁:

string ac_sanc[2]; // it will hold oly y or n 

這也許應該是:

char ac_sanc[30]; 

但是,由於suggested elsewhere,你應該閱讀序列化技術。當你的「cust_details1.txt」有30個(你只使用1的索引,其中數組是從零開始的)條目時會發生什麼?

而請,請學會縮進你的代碼!