在.txt文件中查找项目数

时间:2018-05-04 17:57:56

标签: c++

我正在寻找一种方法来查找.txt文件中的项目数。

文件结构如下:

students.txt pricem 1441912123
house.pdf jatkins 1442000124
users.txt kevin_tomlinson 1442001032
accounts.mdb kevin_tomlinson 1442210121
vacation.jpg smitty83 1442300125
calendar.cpp burtons 1442588012

在这个例子中结果应该是18,因为有18个单独的"单词"在这个文件中。

我需要这个值,所以我可以遍历项目并将它们分配给一组结构(也许有一种方法可以同时完成这两个步骤?):

// my structure
struct AccessRecord
{
   string filename;
   string username;
   long timestamp;
};

// new instance of AccessRecord
// max possible records: 500
AccessRecord logRecords[500];

// while file has content
while (!fin.eof())
{
   // loop through file until end
   // max possible records: 500
   for (int i = 0; i < 500; i++) // need to figure out how to iterate
   {
      fin >> logRecords[i].filename
          >> logRecords[i].username
          >> logRecords[i].timestamp;
   }
}

然后将其写入屏幕。

所以问题是,我如何找到计数?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您知道每行包含一个字符串,一个字符串和一个long,因此您可以使用:

进行迭代
std::vector<AccessRecord> logs;
std::string fname, uname;
long tstamp;
while(fin >> fname >> uname >> tstamp) {
    logs.push_back(AccessRecord(fname, uname, tstamp));
    //To avoid copies, use: (thanks @Rakete1111!)
    //logs.emplace_back(std::move(fname), std::move(uname), tstamp);
}

这假设你已经为你的结构创建了一个构造函数,如:

AccessRecord(std::string f, std::string u, long t)
               : filename(f), username(u), timestamp(t) { }

请注意,我在这里使用的是std::vector而不是数组,因此我们甚至不必担心项目的数量,因为矢量会自动调整大小!

答案 1 :(得分:0)

您应该为您的结构重载operator>>

struct AccessRecord
{
   string filename;
   string username;
   long timestamp;
   friend std::istream& operator>>(std::istream& input, AccessRecord& ar);
};

std::istream& operator>>(std::istream& input, AccessRecord& ar)
{
   input >> ar.filename;
   input >> ar.username;
   input >> ar.timestamp;
   return input;
}

这使您可以简化输入功能:

AccessRecord ar;
std::vector<AccessRecord> logs;
//...
while (fin >> ar)
{
  database.push_back(ar);
}

通常,如果您直接访问类或结构之外的对象数据成员,则会出现问题。在互联网上搜索“数据隐藏”,“c ++封装”和“c ++松散耦合”。