繁体   English   中英

从cpp文件中逐字读取

[英]Read word by word from file in 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;
}

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

您的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
}

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

如果您无法控制输入,则应使用std::vectorpush_back或至少检查i < arraySize来捕获此类错误。

您的代码有一些问题。

while(in_file)

到达终点或出现错误时不会失败,而是选择:

while(in_file.good())

下一个:

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

这可能应该是:

char ac_sanc[30];

但是,正如在其他地方建议的那样 ,您可能应该阅读序列化技术。 当您的“ cust_details1.txt”具有三十个条目(您仅使用1的索引,其中数组从零开始)时,会发生什么情况?

并且,请学习缩进代码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM