检查整个文件是否存在名称

时间:2019-03-22 03:33:51

标签: c++

我试图将文件中的每个数据解析为student.namestudent.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进行比较?

3 个答案:

答案 0 :(得分:0)

您可以制作一个并将数据放入其中。

因此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 */ 包含每个学生的所有studentsname信息。现在,您提示用户输入要搜索的名称,并简单地循环存储的名称,例如

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:;
    }
}

仔细检查一下,如果还有其他问题,请告诉我。