在文件中查找具有特定字符串的行数

Posted

技术标签:

【中文标题】在文件中查找具有特定字符串的行数【英文标题】:Finding a number of a line with a specific string in a file 【发布时间】:2017-02-20 11:46:49 【问题描述】:

我希望我的程序返回包含特定字符串的行数。 整行应该是这个字符串。

我不知道为什么它总是返回整个文件的长度。

我的代码:

#include <iostream>
#include <string>
#include <fstream>
#include <limits>
#include <windows.h>

using namespace std;


int main () 
int x;
x=0;
string filename, inputfilename, line;
ifstream inputfile;

while(!inputfile.is_open()) 
    cout << "Input filename: ";
    getline (cin, inputfilename);
    inputfile.open(inputfilename.c_str(),ios::in | ios::binary);


//string obj = "[I.LOVE.COOKIES]"; //Was like this
string obj = "[I.LOVE.COOKIES]\r"; //Adding \r solved the problem
while(getline(inputfile, line))

    if(line==obj)
    
        return x;
    
    else
    
        x++;
    


return 0;

【问题讨论】:

因为文件不包含搜索字符串,并且显示的代码在这种情况下表现出未定义的行为,通过从 main() 返回而不带值。此外,该程序只能正确处理非常小的文件,因为程序的返回码仅限于 7 位。换句话说:废弃这整件事,然后从头开始重写。 如果你正在阅读文本,我会放弃 ios::binary... @SamVarshavchik 为什么从没有值 UB 的 main 返回? 我忘了在最后复制 return 0,但不是这样,因为在文件中必须有这个字符串。 请添加您正在阅读的文件中的示例文本和文件编码。 【参考方案1】:

您可能需要在打开文件时省略 ios::binary 作为参数。

问题在于,在 Windows 上,一行以两个字符 \r\n 结尾。如果您以二进制模式打开文件,std::getline 将读取一行并包含回车符\r。这意味着您的字符串比较失败,因为字符串"[I.LOVE.COOKIES]" 不以\r 结尾。

【讨论】:

非常感谢!在字符串末尾添加 \r 解决了这个问题。字符串 obj = "[I.LOVE.COOKIES]\r"; @Ziemni What should I do when someone answers my question?

以上是关于在文件中查找具有特定字符串的行数的主要内容,如果未能解决你的问题,请参考以下文章

sed:查找并替换以特定字符串开头的行中的第 n 个字符

查找具有部分匹配的行

从文件中找出字符“a”,然后计算出现该字符的行数[重复]

python如何实现 文件中查找上/下一个字符串

批处理查找字符串

Oracle SQL 选择不同的查询以返回特定的行数