从cpp文件中逐字读取

时间:2011-08-21 06:05:22

标签: c++ file

我试图从文件中逐字读取并将其存储在cpp中的相应数组中。我在执行它时遇到了问题。你们能帮我找到问题吗?这是我的代码


void Read_file()
{
  int i=1;

  ifstream in_file("cust_details1.txt"); 
  if(in_file.is_open())
  {
    cout<<"List of all bills:\n"<<endl;
    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 = "<<ac_no[i]<<" Name = "<<ac_name[i]<<" Amount = "<<ac_amount[i]<<" Emi = "<<ac_emi[i]<<" Sanction = "<<ac_sanc[i] <<endl;
      i++;
      cout<<"----------------------------------------------------"<<endl;
    }
    in_file.close();
    tot=i;
  }
  cout<<"Exiting"<<endl;
}

此代码在第一次循环时执行良好。即第一组记录存储在数组中。当循环第二次进入时,它会遇到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];

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

您正在写入第一个循环中的第二个元素(ac_no[1],而不是ac_no[0]。)如果您的数组大小为2,那么这可以解释它崩溃的原因。

如果你无法控制输入,你应该使用std::vectorpush_back,或至少检查i < arraySize是否可以捕捉到这样的错误。

答案 2 :(得分: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中的索引,其中数组是从零开始的)条目时会发生什么?

请,请学习缩进代码!