这是我主要的一部分:
int main() {
Inventory Master;
bool flag;
Customer Bob("Bob", "CreditCard.txt");
Customer Chris("Chris", "CreditCard.txt" );
}
这是我的方法:
Customer::Customer( string n, string fileName ) {
name = n;
ifstream Credit;
Credit.open(fileName.c_str(), ios::in);
while( Credit.good() && !Credit.eof() ) {
Credit >> card >> balance >> ws;
cout << card <<"\t" << balance << endl;
}
CreditCard _CC( int card, double balance);
}
这是我的“CreditCard.txt文件:
12345 15.00
32564 20.00
我想要显示信息的方式是分配给Bob的第1行“12345 15.00”和分配给Chris的第2行,如果我创建客户的新实例或对象,则执行此操作等等。然而,我目前实现它的方式是它继续为Bob和Chris分配“12345 15.00和32564 20.00”。我可以感谢帮助,如果有人可以告诉我如何以某种方式指向文本文件的某些行,以便将Bob分配给第1行,将Chris分配给第2行,将更多客户分配给其他行,当我将它们添加到文本文件中时。< / p>
答案 0 :(得分:0)
istream.getline()http://www.cplusplus.com/reference/iostream/istream/getline/可能是你的答案。一次只读一行。
这里有一个小例子: http://www.cplusplus.com/forum/beginner/27799/
我的一个老本垒打的小例子:
ifstream fin(fileName);
char buffer[256];
int count = 0;
if (fin.is_open())
{
while (!fin.eof())
{
fin.getline(buffer, 256);
}
}
答案 1 :(得分:0)
你对Bob和Chris所做的一切都发生在构造函数中。所以,正如所写的那样,你的代码说:当流处于良好状态并且它不是文件的末尾(关键点)时,请写入此处。
好吧,如果您考虑一下,这将会读到Customer
的每个实例到达文件末尾的时间。那不是你想要的。我可能会建议将名称添加为数据文件中每个记录的第一个字段。然后,您可以在文件中搜索正确的记录,假设您确保名称都是唯一定义的,然后逐字符串地拉出数据。这样每次都不会从头到尾阅读。我将“Bob”添加为第1行的第一个字段,将“Chris”添加到第2行并创建string name = "Chris";
。所以......
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
string tempStr;
string name = "Chris";
ifstream Credit;
Credit.open("Info.txt", ios::in);
while( Credit.good() && !Credit.eof() )
{
getline(Credit, tempStr, ' ');//Reads the first records name field
cout << tempStr << endl;
if(name.compare(tempStr) == 0)//Compares the "name" to the field.
{ //If true they are the same
//Proceed to do reading and assignments with additional getline statements
cout << "Chris was matched the second time around!";
Credit.setstate(ios::eofbit, true);//***Sets eof to true
}
else
{
Credit.ignore(50, '\n');
//That should put Credit in the proper position to read the next name
}
}
}
你这样做会导致问题。唯一可行的方法是,如果你知道文件中记录的位置。如果您有五条记录怎么办?当你到达第三个时,你必须ignore
或类似的,在你正在进行的那个之前的所有领域。此外,人们可以方便地从数据文件中读取打印件。为每条记录提供标签(名称)的另一个原因。此外,你显然是using namespace std;
,所以我也这样做了,但它不赞成。