查找文件中的项目数.txt

Find number of items in .txt file

本文关键字:项目数 txt 文件 查找      更新时间:2023-10-16

我正在寻找一种在.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;
}
}

然后将其写入屏幕。

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

您知道每行包含一个字符串、一个字符串和一个长字符串,因此您可以迭代:

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而不是数组,这样我们甚至不必担心项目的数量,因为向量会动态调整自身大小!

你应该为结构重载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++ 松耦合"。