我正在寻找一种方法来查找.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;
}
}
然后将其写入屏幕。
所以问题是,我如何找到计数?或者有更好的方法吗?
答案 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 ++松散耦合”。