从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"<<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;
}
这段代码在第一次循环时执行良好。即第一组记录被存储在数组中。当循环第二次运行时,它遇到了一个隔离故障。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++;
}
这样的循环确保如果文件中有任何错误,它将停止读取。
顺便说一下,每个数组的大小应该足够大,以容纳文件中的所有值。除了string ac_sanc[2]
,你已经声明了每个大小为30
的数组。为什么ac_sanc
的大小只有2
?你知道这意味着什么吗?这意味着ac_sanc[i]
将为i >=2
调用未定义行为。您的程序可能(很有可能)崩溃。此外,如果它只能是y
或n
,那么为什么不将其声明为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::vector
和push_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"有 30个项时(您只使用从1开始的索引,其中数组是从零开始的)会发生什么?
请,请学会缩进你的代码!
相关文章:
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在读取文件大小时文件IO速度会发生变化
- 读取文件时运行时的未知行为
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C++ 读取文件读取文件不正确
- 读取文件并将其存储在unordered_map中时出现问题
- 读取文件时无法使用 OpenMP 获得加速
- 使用istringstearm和get行缓慢读取文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 读取文件时引发异常
- 从标准输入读取文件后读取用户输入
- 在读取文件后重置句柄
- 如何在C++编译时读取文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 读取文件在第二次调用时返回INVALID_HANDLE
- 通过指针读取文件
- 逐行读取文件,并将数据插入变量和数组中