首先让我首先感谢那些经常在这里发帖的人,过去几年我在这个网站上获得了大量的知识。
好的,之前已经问过这个问题,但我有一点点麻烦,我无法工作。
这是我的结构。
struct person
{
string Sex;
string Name;
string Match;
int phoneNumber;
int numInterests;
vector<string> interests;
};
该作业被设计为约会计划&#34;这与具有相似兴趣的异性人士相匹配。
以下是遵循以下格式的示例文本文件:
&#34;性别&#34; &#34;名称&#34; &#34;电话号码&#34; &#34;兴趣量&#34; &#34;兴趣列表&#34; &#34;匹配(如果找到匹配)&#34;
M Tyler 1234567890 3 soccer football tv Jess
F Lyns 1234567890 3 hockey sex movies
F Jess 1234567890 3 soccer football tv Tyler
M Taylor 1234567890 3 hockey sex movies
在该示例文件中,Jess和Tyler匹配。 到目前为止,这是我的职能......
void LoadClients(std::ifstream &file,vector<person>& peps)
{
string sex,name,interests,line, match;
double phone,ni;
person p;
for(int i=0;i<maxPeople("Clients.mf"); i++){
file>>sex>>name>>phone>>ni;
p.Sex = sex;
p.Name = name;
p.phoneNumber = phone;
p.numInterests = ni;
for (int i=0; i<ni; i++){
file >> line;
p.interests.push_back(line);
}
file >> match;
p.Match = match;
peps.push_back(p);
// person p;
//istringstream iss( line );
}
};
函数编译但根本无法正确读取。这是我工作的其余部分,万一你想看到它......
int maxPeople(const char* file)///Just returns the number of lines in the file
{
ifstream inFile(file);
int c = count(istreambuf_iterator<char>(inFile),
istreambuf_iterator<char>(), '\n');
return c;
}
int main()
{
int numberOfClients=maxPeople("Clients.mf");
ifstream file("Clients.mf");
vector<person> peps;
LoadClients(file,peps);
return 0;
}
我的功能LoadClients是在我在此处找到的优雅答案后建模的:Reading a string and integers
我要求的是如何让这个函数从文本文件中创建一个向量或数组。
最终节目将有其他功能&#34; NewClient&#34;,&#34; UnMatch&#34;,&#34; PrintMatched&#34;和&#34; PrintSingles&#34;但我想我可以处理这些。欢迎任何和所有提示:)
感谢阅读!
EDIT1: 使用这种格式。
void LoadClients(std::ifstream &file,vector<person>& peps)
{
person p;
string line;
while( getline( file, line ) )
{
istringstream iss( line );
iss >> p.Sex >> p.Name >> p.phoneNumber >> p.numInterests;
for(int i=0;i<p.numInterests;i++){
string interest;
iss >> interest;
p.interests.push_back(interest);
}
}
};
我决定跳过&#34;匹配&#34;目前。当我从main访问对象时,我收到分段错误。
ifstream file("Clients.mf");
vector<person> peps;
LoadClients(file,peps);
for(int i=0; i<numberOfClients;i++){
cout << peps[0].Name;
}
答案 0 :(得分:3)
由于您的记录输入是基于行的,因此请使用基于行的阅读器。该程序现在的问题是它假定总是匹配。但是在输入文件的第二行,没有匹配项。因此,将读取下一个以空格分隔的文本。
我喜欢这种从文件中解析行的方法,因为它很简单:
string line;
while( getline( file, line ) )
{
istringstream iss( line );
// Now, parse out of 'iss' instead of 'file'.
person p;
bool ok = false;
if( iss >> p.Sex >> p.Name >> p.phoneNumber >> p.numInterests )
{
p.interests.reserve( p.numInterests );
for( int i = 0; i < p.numInterests; i++ )
{
string interest;
if( iss >> interest ) p.interests.emplace_back( interest );
}
ok = !iss.error();
iss >> p.Match; // optional
}
if( ok ) peps.push_back( p );
}
您可以更进一步,为Person
结构定义流输入运算符。然后,主读取循环看起来像:
person p;
iss >> p;
答案 1 :(得分:1)
电话和ni(我假设的是兴趣数量)不应该是双倍的。我会把Phone变成一个字符串而ni是一个int(有些人认为没有签名但足够接近)。
Double和Float是'有损'数据类型,不适合计数或电话号码。
您实际上并没有说出行为是什么以及您期望它是什么。 我假设你的负载是乱七八糟的,这是因为这一行:
file >> match;
您不知道该行是否包含该行,因此它可能会接收下一行的第一个作品。
我会切换到使用getLine和一个字符串流,并在提取匹配之前检查该行是否为空(IE字符串流是否结束)。
答案 2 :(得分:1)
顺便说一句,string
成为int phoneNumber
的好主意 ,除非你喜欢你的程序来处理外星人。你的numInterests
可能有问题。如果您有interests.size()
,则struct Person {
enum class Gender {
Unknown,
Male,
Female,
};
Gender gender;
std::string name;
std::string match;
std::string phoneNumber;
std::vector<std::string> interests;
};
是多余的。所以你可能会......
static Person::Gender readGender(std::ifstream &input) {
char ch;
input >> ch;
switch(ch) {
case 'M':
return Person::Gender::Male;
case 'F':
return Person::Gender::Female;
default:
return Person::Gender::Unknown;
}
}
void LoadClients(std::ifstream &file, std::vector<person> &out) {
for(int i = 0; i < maxPeople("Clients.mf"); i++) {
Person p;
unsigned numInterests;
p.gender = readGender(file);
file >> p.name;
file >> p.phoneNumber;
file >> numInterests;
for(unsigned i = 0; i < numInterests; i++){
std::string interest;
file >> interest;
p.interests.push_back(interest);
}
file >> p.match;
out.push_back(p);
}
}
现在,问题。该函数应该看起来像(没有检查和C ++ 11!)...
match
编辑:您应该有一个方法让程序区分是否有$('input:focus').closest('tr').parent().find("tr:nth-child(2)").find('td:nth-child(3)').find('input')
,否则未定义的挫折会找你!
修改:由于来自OP的评论,以前的评论无效。
编辑:根据评论修正了一些陷阱。