从文本文件输入,没有正确显示,为什么?

时间:2012-08-08 22:41:21

标签: c++ visual-c++

这是我主要的一部分:

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>

2 个答案:

答案 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;,所以我也这样做了,但它不赞成。