C++ getline() 函数引入整个文件

标签 c++ file-io getline

我正在尝试搜索文档并找到一个子集来打印出该特定行,但是,它似乎会立即提取整个消息。

ifstream inputFile("searchfile.dat");

  int search;

  cout << "Enter what you're searching: ";
  cin >> search;

  string line;
  //bool notFound;

  while(getline(inputFile, line) /*&& notFound*/){
    if (line.find(search)) {
      cout << line << endl;
      //notFound = false;
    }
    //line = "";
  }


  inputFile.close();

这是一项家庭作业,所以我更改了一些变量。回答时请记住这一点(即解释发生了什么,以便我从中学习)

非常感谢!

附言这是我目前正在处理的数据:

Name1  Name1  1000001  12.00
Name2  Name2  1000002  14.00
Name3  Name3  1000004  16.00

我需要搜索 1000000 的号码并仅打印该行。例如,我会搜索 1000002,它会打印: Name2 Name2 1000002 14.00

现在它将打印整个东西

最佳答案

要进行非常基本的修复,请执行此操作

#include<iostream>
#include<fstream>
using namespace std;

int main(){
    ifstream inputFile("searchfile.dat");

    string search;

    cout << "Enter what you're searching: ";
    cin >> search;

    string line;

    while(getline(inputFile, line) ){        
        if (line.find(search) != string::npos) {
            cout << line << endl;
        }
    }
}

您遇到的问题是双重的。

首先,string::find 不会返回可以在 bool 上下文中正确评估的内容。它返回可以找到该值的索引或以其他方式返回 string::npos。因此,如果您检查它,它将评估您是否正确。

另一个问题是您将搜索输入为整数,然后尝试在字符串中查找它。结果,它正在调用此 size_type find (charT c, size_type pos = 0) const; 重载 find,它试图找到一个字符。之所以会这样,是因为 int 可以隐式转换为 char。在使用 find 之前,您应该将您的 ID 作为字符串读入或将其转换为字符串。

注意一些其他的事情。这段代码有点脆弱,因为它会在该行的任何位置找到该字符串,因此如果姓名或工资以某种方式包含该值,它就会被发现。您也不需要显式关闭 ifstream,它在析构函数中关闭。

关于C++ getline() 函数引入整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42015260/

相关文章:

c++ - 编译包含 Ogre3D 的 DLL 在使用时会出现断言错误

java - 使用FileReader读取文件

c - valgrind 使用 getline 函数报告内存丢失

c++ - 使用 std::vector 编写可调整大小的 vector 时出现问题

c++ - 如何将方法结果作为参数传递给 C++ 中的基类构造函数?

c++ - 将十六进制 charArray 转换为 String

c++ - 从 file_2 获取输入

c - 为什么在重定向到同一文件时会覆盖部分输出,但在重定向到终端时却不会?

c++ - get 函数返回无效值

c++ - 使用 cin.get 提取特定数量的字符并确保正确