【问题标题】:C++ getline() function bringing in whole fileC++ getline() 函数引入整个文件
【发布时间】:2017-06-20 07:03:54
【问题描述】:

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

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,它会打印: 名称2 名称2 1000002 14.00

现在它将打印整个内容

【问题讨论】:

  • MCVE 请。输入文件是什么样的?是一条线吗?
  • 所有不同的行看起来像:first last id 工资
  • 我在找身份证
  • 我很难把数据放在这里。为了测试,我有 3 行。 Name1[tab]Name2[tab]1000001[tab]10.00[endline]Name2[tab]Name2[tab]1000002[tab]12.00[endline]Name3[tab]Name3[tab]1000003[tab]14.00[endline] 每次我点击了输入标签,它提交了评论,所以这是我能给你的最好的了
  • 谢谢,我在上面做了并提供了更多信息

标签: c++ file-io getline


【解决方案1】:

对于一个非常基本的修复,请执行此操作

#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 不会返回可以在布尔上下文中正确评估的内容。它返回可以找到值的索引或string::npos。因此,如果您检查它,它将评估您的 if 正确。

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

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

【讨论】:

  • @StaceyK 您可以通过接受它来收藏答案。您可以点击投票总数旁边的箭头。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2013-11-30
  • 2012-09-21
  • 2015-12-30
相关资源
最近更新 更多