2011-08-21 120 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的索引,其中数组是从零开始的)条目时会发生什么?

而请,请学会缩进你的代码!