c++ 文本文件中查找字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 文本文件中查找字符串相关的知识,希望对你有一定的参考价值。

在一个已知的文本文件(是文章)中查找字符串,统计该字符串在文章中出现次数,字符串由用户给定
代码尽量详细
谢谢!
谢谢啊看来我没说清楚……最好用上<fstream>库和类
要不我也会C的……但到c++就晕了……

我觉得是查找一篇文章中某个单词数出现的次数,但是你题目的要求是查找字符串出现的次数,所以我还是按你的题意来写的

还有,我并不赞同楼上那些用C风格字符串的处理方式,C不像C,C++不像C++。
C++的字符串处理远比C要简单便捷

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()

fstream fin("file.txt", ios::in);
if(!fin)

cerr << "cannot open file " << endl;
return -1;

string s;
cout << "请输入要查找的字符串:";
cin >> s;
string t;
int num = 0;
string::size_type i;
while(!fin.eof())

fin >> t;
if(t.size() > s.size())

for(i = 0; i != s.size(); i++)

if(t[i] != s[i])
break;

if(i == s.size())
num++;

else if (t == s)
num++;

fin.close();
cout << "该字符串共出现了" << num << "次" << endl;
return 0;
参考技术A 100分,加给我
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char token; // 当前从文件获取的字符
int count;

void parse(char token, FILE *fp, char wordname[]);
void cmpword(char str[], char name[]);

int main()

// 输入文件名,可以包含路径,如果与程序在相同上当,可只写文件名不写目录
char fname[50]; //文件名
char wordname[100]; //要查找的字符串
FILE *fp;
count = 0;
printf("please input file name: ");
scanf("%s", fname);
printf("please input word name: ");
scanf("%s", wordname);
fp = fopen(fname, "r");
if (fp == NULL)

printf("IO ERROR\n"); // 文件打开出错
printf("press any key to exit");
return 0;

else

while ((token = fgetc(fp)) != EOF)

switch (token)

// 空白符和换行的处理
case ' ':
case '\t':
case '\n':
break;
// 关键词的处理
default:
parse(token, fp, wordname);
break;



printf("%s appear %d times!\n", wordname, count);
return 0;


// 关键词分析程序
void parse(char token, FILE *fp, char wordname[])

char keyword[1024];
int index = 0;
// 将每个词第一个字符赋给数组第一个元素
keyword[0] = token;
// 开始读字符,直到遇到空白符,说明找到一个词
while ((keyword[++index] = fgetc(fp)) != ' ' &&
keyword[index] != '\t' && keyword[index] != EOF &&
keyword[index] != '\n')
;
// 加结束符
keyword[index] = '\0';
//比较是否为要查找的关键词
cmpword(keyword, wordname);


//查找计数
void cmpword(char str[], char name[])

if (strcmp(str, name) == 0)
count++;
参考技术B ==========================================
问题补充:谢谢啊看来我没说清楚……最好用上<fstream>库和类
要不我也会C的……但到c++就晕了……
==========================================
给,下面是用上<fstream>库的程序,已经编译运行确认,你再看看吧:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>
using namespace std;

#define MAXLINELENGTH 1024
#define N 20 //暂定需要查找的字符串的最大长度为20

int sumstrstr(char *, char *);

int main()

char str[N]=NULL;
char txtarray[MAXLINELENGTH];
int i = 0;
char c;
int sumcount = 0;
fstream fp;

fp.open("data.txt",ios::in); //暂定文件名为"data.txt"

memset(txtarray, 0, sizeof(txtarray));

if (!fp)

cout<<"Open File Error..."<<endl;
exit(1);


cout<<"请输入要查找的字符串: "<<endl;
cin>>str;

while (fp>>c)

if(c== EOF) break;

if (c != '\n')

txtarray[i] = c;
i++;

else//Read a line of the file


sumcount += sumstrstr(txtarray, str);
i = 0;
memset(txtarray, 0, sizeof(txtarray));



sumcount += sumstrstr(txtarray, str);//The last line of the file

cout<<endl<<"该字符串在文章中出现次数为: "<<sumcount<<"次."<<endl;

fp.close();;

system("pause");
return 0;


int sumstrstr(char *str1, char *str2)

int sum = 0;
char *str3 = NULL;
int i = 0;
while ((str3 = strstr(str1, str2)) != NULL)

str1 = str3;
sum++;
for (i = 0; i < strlen(str2); i++)
str1++;


return sum;
参考技术C 这里有各种算法综述的文章,你看看。
http://www.yuanma.org/data/2008/0806/article_3128.htm

你喜欢那个算法,就找那个算法的源码。应该很简单。自己写一个也行,就是估计效率比较差。
参考技术D 问老师

什么正则表达式仅在 C++ 源文件中查找字符串

【中文标题】什么正则表达式仅在 C++ 源文件中查找字符串【英文标题】:What regular expression to find strings only in C++ source files 【发布时间】:2014-04-29 14:02:23 【问题描述】:

我有一个 C++ 应用程序,我正在转换每个字符串文字以及使用泛型类型启用 unicode 的方法,换句话说,正在完成以下转换

const char* str = "this is \"simple string\""; //=> const TCHAR* str = _T("this is \"simple string\"");
MessageBoxA(NULL, "message", "title", MB_OK);//=>MessageBox(NULL, _T("message"), _T("title"), MB_OK);    
size_t len = strlen(str);//=>size_t len = _tcslen(str);

最大的问题是应用程序包含大量文字字符串,我需要一个正则表达式模式来仅查找文字字符串并将它们替换为 _T(previous_str),我从 web 中找到了许多表达式,并且从 *** 中找到了许多表达式,但是它们还匹配标题包括

#include "stdafx.h" // => #include _T("stdafx.h")

我还需要避免以 _T( 开头并以 ) 结尾的字符串 [之前已经转换]。

【问题讨论】:

您正在尝试解析源代码。这真是一项艰巨的任务。这就是为什么如果您选择正则表达式路径(硬件),您将需要一个强大的正则表达式引擎,如 PCRE 或 .NET。那么您使用的是什么引擎,您尝试过什么? 我用的是visual studio 2013 IDE,它挂了很长时间 您仍然可以分两遍执行此操作:将所有"string" 转换为_T("string"),然后将所有#include _T("stdafx.h") 转换为#include "stdafx.h"_T(_T("string")) 相同 -> _T("string")) . 这可能很好但很长,但是正则表达式的力量在哪里 @ahmedsafan86:当然是在解析 Regular 语法时。这就是名字的由来。但 C++ 绝不是常规的。 【参考方案1】:

艾哈迈德这是一个有趣的问题。让我们谈谈我们如何使用正则表达式来做到这一点。有很多选择,这就是我要做的。

A.我将在 VisualStudio 之外处理文件,以便您可以使用正则表达式的全部功能。您可以使用 C++、C# 或 PHP 或 python 等脚本语言,并为其提供要处理的文件数组或文件夹。

B.这是一个正则表达式,可以将您想要的字符串捕获到第 1 组中:

(?s)_T\([^)]*\)|#include[^\n]*|"((?:[^"]|(?<=\\)")+)(?<!\\)"

使用这个正则表达式,我们希望完全忽略返回的整体匹配,而只关注第 1 组捕获(如果有)。

在您的测试文本中,捕获是 this is \"simple string\" 和正确的 messagetitle

这捕获了字符串的内部,但我们可能需要它们来替换,所以要包含双引号,只需将它们移动到组 1 中:

(?s)_T\([^)]*\)|#include[^\n]*|("(?:[^"]|(?<=\\)")+(?<!\\)")

C.当调用你的语言的正则表达式 Replace 函数时,不是直接传递一个替换,而是传递一个回调函数。该函数将自动访问第 1 组匹配项(这就是替换回调的工作方式),您可以根据自己的意愿操作替换:例如,如果第 1 组为空,则不要替换(这意味着我们匹配了你想避免的字符串)。如果您有第 1 组,请发挥您的串联魔法。

很难更具体,但这是我使用正则表达式的一般方法。

【讨论】:

真的太棒了,我在我最喜欢的 .NET 正则表达式在线测试器 derekslager.com/blog/posts/2007/09/… 中对其进行了测试,您的模式对我有很大帮助,我添加了一个部分以记住 L"",后缀 (?s)L"(?:[^"]|(? @ahmedsafan86 很高兴,很高兴它有所帮助,感谢您的友好反馈。 :)

以上是关于c++ 文本文件中查找字符串的主要内容,如果未能解决你的问题,请参考以下文章

C++ 在文本文件中搜索特定字符串并返回该字符串所在的行号

在外部文本文件中查找字符串所在的行号

如何知道文本文件中的字符串是不是在第一行? [C++]

程序未从文本文件 c++ 中打印出字符串

Perl:在多个文本文件中查找和替换特定字符串

使用python实现查找文本文件中的指定字符串