【问题标题】:Search a file by a word and then print specific number of line in C++按单词搜索文件,然后在 C++ 中打印特定行数
【发布时间】:2020-01-14 03:23:11
【问题描述】:

我只是一个初学者,试图将 3 个不同的学生记录保存在一个文件中,然后使用学生姓名读取记录。我想要有关名称的信息,例如姓名、卷号和标记。这是到目前为止的代码,但它显示了整个文件。 到目前为止,这是我的代码:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct student
{
  string name;
  int rollno;
  float marks;
};
main()
{
  student s1,s2,s3;
  int search;
  string line;
  cout<<"Enter Name: ";
  getline(cin,s1.name);
  cout<<"Enter Roll No: ";
  cin>>s1.rollno;
  cout<<"Enter Marks: ";
  cin>>s1.marks;
  cout<<endl;
  cout<<"Enter Name: ";
  getline(cin,s2.name);
  getline(cin,s2.name);
  cout<<"Enter Roll No: ";
  cin>>s2.rollno;
  cout<<"Enter Marks: ";
  cin>>s2.marks;
  cout<<endl;
  cout<<"Enter Name: ";
  getline(cin,s3.name);
  getline(cin,s3.name);
  cout<<"Enter Roll No: ";
  cin>>s3.rollno;
  cout<<"Enter Marks: ";
  cin>>s3.marks;
  cout<<endl;
  ofstream fout;
  fout.open("Record.txt");
  fout<<"Name: "<<s1.name<<endl;
  fout<<"Roll No: "<<s1.rollno<<endl;
  fout<<"Marks: "<<s1.marks<<endl;
  fout<<"Name: "<<s2.name<<endl;
  fout<<"Roll No: "<<s2.rollno<<endl;
  fout<<"Marks: "<<s2.marks<<endl;
  fout<<"Name: "<<s3.name<<endl;
  fout<<"Roll No: "<<s3.rollno<<endl;
  fout<<"Marks: "<<s3.marks<<endl;
  fout.close();
  cout<<"Search By Name: ";
  cin>>search;
  ifstream fin;
  fin.open("Record.txt");
  while(getline(fin,line))
  {
     if(line.find(search))
     {
        cout<<line<<endl;
     }
     else
     {
        cout<<"Record Not Found!";
     }
  }
  fin.close();
}

【问题讨论】:

  • 您的代码有什么问题?它不做你想让它做的事吗?请解释如何
  • 不直接相关,但您的文本文件将包含每个学生记录的 3 行。真的是你想要的吗?
  • @foreknownas_463035818 它打印完整的文件,我只想打印一个学生的记录
  • @SergeBallesta 是的,然后我想使用该名称进行搜索并获取该名称的所有 3 条记录,即名称、卷号和标记,并且不应显示所有其他行

标签: c++


【解决方案1】:

这一行

if(line.find(search))

似乎假设std::string::find 将返回转换为true 的内容,以防找到搜索字符串,否则返回false

如果你阅读它的实际作用(例如here)你会发现它的返回值是:

找到的子字符串的第一个字符的位置,如果没有找到这样的子字符串,则为 npos。

因此,上述if 的条件评估为false 的唯一情况是子字符串的位置为0(即它实际上已找到)。如果您在行首写下学生的姓名,您可以尝试看到这一点。使用您当前的代码,只会跳过该行。你真正想要的是

if (line.find(search) != std::string::npos)

接下来,您错误地将search 声明为int。您可能没有收到错误,因为find 的重载需要char。我本来预计至少会对此发出警告。无论如何,search 应该是std::string

一旦你解决了这个问题,你就不想为每一个不包含你正在寻找的名字的单行打印""Record Not Found!"。也许使用bool 标志来告诉您是否已经找到该行。

此外,当您找到正确的条目时,您必须调整代码以打印接下来的两行。

bool found = false;
while(getline(fin,line)) {
    if(line.find(search) != std::string::npos) {
        found = true;
        cout << line << endl; 
        // todo: read and print also the next two lines         
        break; // leave the while loop
    }
}
if (found == false) cout<<"Record Not Found!";

break 是在您找到正确的条目后停止读取文件。当可能有更多同名学生时,您可能希望将其删除。

最后一点,你应该重新考虑你的逻辑。如果学生的名字是“Roll”或“Marks”怎么办?不太可能,但是如果您请求要查找的行是 "Name: [name of student]" 而不是只要求在某处包含学生姓名,则可以防止代码在这种情况下失败。

【讨论】:

  • 谢谢!!!但现在我被困在如何打印下一行 ugh
  • @Umair 我没有发布整个解决方案,所以你仍然可以从中获得一些乐趣:P。只需再次使用getline
  • 是的,我想通了,但忘了编辑我的评论,哈哈,非常感谢!
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多