如何在文件中查找单词或句子?请求排查C++代码错误
在C++中查找文件里的指定单词/句子,以及你的代码问题排查
嘿,我来帮你搞定这个文件查找的问题,顺便把你代码里的坑一个个揪出来~
你的代码存在的核心问题
先看看你写的这段代码,几个关键问题导致它无法正常工作:
字符数组不能直接用
==比较
你写的if(x=="word")是在比较两个指针的地址:x是字符数组的首地址,"word"是字符串常量的内存地址,这俩永远不会相等。要比较C风格字符串的内容,得用C标准库的strcmp函数,或者更简单的——直接用C++的std::string类型。file.eof()的判断时机错误
你把!file.eof()放在循环条件里,会导致最后一次读取失败后,循环仍然执行一次。正确的做法是把读取操作放在循环条件里,比如while (file.getline(x,99,' ')),这样只有读取成功才会进入循环。getline的分隔符问题
你用空格作为getline的分隔符,这意味着它会把每个空格分隔的片段读出来,但如果文件里有换行、制表符,或者单词长度超过98(数组长度99,要留一个位置给字符串结束符\0),就会出现读取截断或者漏读的情况。变量替换的误区
- 换成
char变量的话,char只能存单个字符,根本装不下一个单词,自然会失败; - 换成
string变量的话,你得用std::string类型,并且调整读取方式(比如用file >> str或者getline(file, str)),而不是直接替换数组名。
- 换成
修正后的代码示例
这里给你两种可行的修正方案:
方案1:用C++的std::string(推荐,更安全方便)
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string target = "word"; string currentWord; fstream file("data.txt", ios::in); if (!file.is_open()) { // 先检查文件是否成功打开 cout << "Failed to open file!" << endl; return 1; } // 逐单词读取(默认用空白字符分隔:空格、换行、制表符) while (file >> currentWord) { if (currentWord == target) { cout << "Found at position!" << endl; // 如果要找所有出现的位置,可以在这里记录行号或者继续循环 // 如果找到一个就退出,直接break; } } file.close(); return 0; }
方案2:继续用C风格字符数组(适合熟悉C的场景)
#include <iostream> #include <fstream> #include <cstring> // 要包含strcmp的头文件 using namespace std; int main() { char x[99]; const char* target = "word"; fstream file("data.txt", ios::in); if (!file.is_open()) { cout << "Failed to open file!" << endl; return 1; } // 正确的循环方式:读取成功才进入循环 while (file.getline(x, 99, ' ')) { // 用strcmp比较,返回0表示相等 if (strcmp(x, target) == 0) { cout << "found"; } } file.close(); return 0; }
拓展:查找完整句子的方法
如果要查找整个句子(包含空格、换行等),可以逐行读取文件内容,然后在每行里查找目标字符串:
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string targetSentence = "Hello world!"; string currentLine; fstream file("data.txt", ios::in); if (!file.is_open()) { cout << "Failed to open file!" << endl; return 1; } int lineNum = 0; while (getline(file, currentLine)) { lineNum++; // 查找子字符串,find返回string::npos表示没找到 if (currentLine.find(targetSentence) != string::npos) { cout << "Found sentence at line " << lineNum << endl; } } file.close(); return 0; }
内容的提问来源于stack exchange,提问作者Eslam Mohamed
相关产品推荐
相关产品推荐

