我试图将文件中的每个数据解析为student.name
和student.pass
,以仅获取student.name
。我可以成功获取所有student.name
,但是要检查的是每行之后,然后我才能比较所有student.name
是否包含名称或名称是否存在。
while(fscanf(fp, "%[^:]%*c%[^\n]%*c", &student.name, &student.pass) != EOF)
{
printf("Username is %s\n", student.name);
if(strcmp(student.name, a)==0)
{
cout << "Exists" << endl;
}
else
{
cout << "Not Exists" << endl;
}
}
此代码中发生的事情是它检查每一行并进行比较。当我尝试将if else条件放在while条件之后时,它只能检查最后一个数据。
如何将名称与文件中的所有student.name进行比较?
答案 0 :(得分:0)
您可以制作一个vector并将数据放入其中。
因此while循环代码段的一部分变为:
#include <vector>
//...
std::vector<accout> accouts;
while(...) {
accouts.push_back(student);
}
//process accouts here
答案 1 :(得分:0)
如果我理解得很好,您想输入
if(strcmp(student.name, a)==0)
{
cout << "Exists" << endl;
}
else
{
cout << "Not Exists" << endl;
}
while循环之外。这样,在while循环中,您将仅解析文件中的所有条目,直到到达最后一个,然后退出while循环。此后,它将把文件中的姓氏与您要搜索的名称进行比较。考虑一下迭代向量以检查x值是否等于向量中的值时的情况。
答案 2 :(得分:0)
当C ++流和getline
(带有':'
的分隔符)提供您所需要的所有东西时,您混杂在一起的C / C ++使您的生活变得极为困难。
下面的示例使用istringstream
来保存要读取的示例数据。只需将其替换为fstream
即可读取文件。
虽然通常要存储从文件中读取的所有数据,但只需声明要读入的tmp
帐户结构和vector
的帐户结构,以保存{{1} }插入向量,例如
.push_back (tmp);
现在您的帐户向量 account tmp; /* temp account to read from file */
...
std::vector<account> students; /* vector of accounts to hold students */
while (getline(is, tmp.name, ':') && /* while name & pass read */
getline(is, tmp.pass))
students.push_back (tmp); /* add to vector students */
包含每个学生的所有students
和name
信息。现在,您提示用户输入要搜索的名称,并简单地循环存储的名称,例如
pass
完成了。它一直循环直到找到匹配项,然后仅使用简单的 std::string search; /* string to hold search */
...
std::cout << "enter name to search: "; /* get search term */
if (getline (std::cin, search)) {
for (auto& s : students) /* loop over structs */
if (s.name == search) { /* comparing names to search */
std::cout << "found: " << s.name
<< " (pass: " << s.pass << ")\n";
goto namefound; /* if found a quick goto to jump not-found */
}
std::cerr << "name not found: " << search << '\n';
namefound:;
}
来结束未找到匹配项时显示的默认输出。 (是的,goto
直到今天仍具有非常有限的用途,但仍然非常有价值)
完全将其放入,您可以这样做:
goto
使用/输入示例
#include <iostream> /* use C++ streams and containers */
#include <sstream>
#include <string>
#include <vector>
struct account { /* your struct */
std::string name, pass;
};
int main (void) {
account tmp; /* temp account to read from file */
std::string search; /* string to hold search */
std::vector<account> students; /* vector of accounts to hold students */
std::istringstream is ( "Mary Jane:12345\n" /* data - replace */
"John Doe:45678" ); /* with your file */
while (getline(is, tmp.name, ':') && /* while name & pass read */
getline(is, tmp.pass))
students.push_back (tmp); /* add to vector students */
std::cout << "enter name to search: "; /* get search term */
if (getline (std::cin, search)) {
for (auto& s : students) /* loop over structs */
if (s.name == search) { /* comparing names to search */
std::cout << "found: " << s.name
<< " (pass: " << s.pass << ")\n";
goto namefound; /* if found a quick goto to jump not-found */
}
std::cerr << "name not found: " << search << '\n';
namefound:;
}
}
仔细检查一下,如果还有其他问题,请告诉我。