C++ 文本文件中的字符串,其中包含C++;
这是我代码中的一部分C++ 文本文件中的字符串,其中包含C++;,c++,string,search,line,contain,C++,String,Search,Line,Contain,这是我代码中的一部分 string word; cin >> word; string keyword; while (file >> keyword && keyword != word){} 这将在文件中搜索一个单词,如果找到该单词(关键字),则稍后将从那里开始一个字符串。目前它工作得很好。我的问题是,当线路 "Julia","2 Om.","KA","1 Om. 4:2" 如果我输入单词Julia,我就找不到它,也无法将其用于我的目的(仅供参考,
string word;
cin >> word;
string keyword;
while (file >> keyword && keyword != word){}
这将在文件中搜索一个单词,如果找到该单词(关键字),则稍后将从那里开始一个字符串。目前它工作得很好。我的问题是,当线路
"Julia","2 Om.","KA","1 Om. 4:2"
如果我输入单词Julia,我就找不到它,也无法将其用于我的目的(仅供参考,我正在计算它)。如果我搜索“Julia”,“2”就行了,因为这是空间的来源
我想知道我怎么换行
while (file >> keyword && keyword != word){}
因此,我可以看到文本/字符串何时包含该字符串,因为目前只有当我完美地输入整个字符串时,它才能找到并接受该字符串
编辑:到目前为止,我还发现只有strstr、strtok和strcmp。但它们更适合printf而不是cout。您可以使用std::string中的方法,比如
find
#include <string>
#include <iostream>
// ...
std::string keyword;
std::string word;
getline(file, keyword);
do
{
std::cin >> word;
}
while (keyword.find(word) == std::string::npos);
#包括
#包括
// ...
std::字符串关键字;
字符串字;
getline(文件,关键字);
做
{
std::cin>>单词;
}
while(关键字.find(word)==std::string::npos);
您可以使用std::string中的方法,比如find
#include <string>
#include <iostream>
// ...
std::string keyword;
std::string word;
getline(file, keyword);
do
{
std::cin >> word;
}
while (keyword.find(word) == std::string::npos);
#包括
#包括
// ...
std::字符串关键字;
字符串字;
getline(文件,关键字);
做
{
std::cin>>单词;
}
while(关键字.find(word)==std::string::npos);
使用此istream方法获得一整行,而不仅仅是一个“单词”:
然后使用strstr查找字符串(如Julia)在字符串(文件行)中的位置:
使用此istream方法获得一整行,而不仅仅是一个“单词”: 然后使用strstr查找字符串(如Julia)在字符串(文件行)中的位置:
问题是您正在提取字符串,默认情况下,字符串将一直提取到下一个空格。因此,在第一次迭代中,
关键字是“Julia”,“2
。如果要提取所有以逗号分隔的内容,我建议使用std::getline
和,
作为delimeter:
while (std::getline(file, keyword, ','))
这将检查所有带引号的字符串。现在,您可以使用std::string::find
来确定输入的word
是否在该带引号的字符串中找到:
while (std::getline(file, keyword, ',') &&
keyword.find(word) == std::string::npos)
现在,它将循环遍历每个带引号的字符串,直到找到包含word
的字符串。问题是您正在提取字符串,默认情况下,将提取到下一个空格。因此,在第一次迭代中,关键字
是“Julia”,“2
。如果要提取所有以逗号分隔的内容,我建议使用std::getline
和,
作为delimeter:
while (std::getline(file, keyword, ','))
这将检查所有带引号的字符串。现在,您可以使用std::string::find
确定是否在该带引号的字符串中找到输入word
:
while (std::getline(file, keyword, ',') &&
keyword.find(word) == std::string::npos)
现在,它将循环遍历每个带引号的字符串,直到它到达包含word
的字符串。因此,如果输入Julia
,您希望它以关键字停止,如“Julia”,“2
?或者你想让它以关键字
作为Julia“
停止吗?不,如果我输入Julia,我想让它找到Julia-在它找不到它的时候,它能够找到“Julia”,“2因为这是整个部分,但我不需要它。因此,如果你输入Julia
,你想让它以关键字
作为“Julia”停止2
?或者您希望它以关键字
作为“Julia”
停止吗?不,如果我输入Julia,我希望它找到Julia-在它找不到它的时候,它能够找到“Julia”,“2因为这是全部,但我不需要。虽然这是我认为他们最初描述的,但我不认为这是他们想要的。他们不想要“Julia”,“2
要匹配为Julia
@sftrabbit,他想找到Julia,即使它被其他字符包围,这会找到Julia,即使它被其他字符包围。是的,这就是我说的Patashu。很抱歉给你带来困惑,谢谢你的回答:)我现在就试着让它工作。@JackLongen我仍然不认为这是你想要的。您仍将提取“Julia”、“2
而不是“Julia”
。使用此方法将根本找不到关键字2 Om.
。虽然这是我认为他们最初描述的内容,但我认为这不是他们想要的。他们不想要“Julia”2
要匹配为Julia
@sftrabbit,他想找到Julia,即使它被其他字符包围,这会找到Julia,即使它被其他字符包围。是的,这就是我说的Patashu。很抱歉给你带来困惑,谢谢你的回答:)我现在就试着让它工作。@JackLongen我仍然不认为这是你想要的。您仍将提取“Julia”、“2
,而不是”Julia“
。使用此方法根本找不到关键字2om.
。谢谢,不过strstrstr更适合printf。我会尝试使用std::string查找方法。@Jack Longen我也更喜欢Julien的回答谢谢,不过strstr更适合printf。我会尝试使用std::string查找方法。@Jack Longen我也更喜欢Julien的答案,嗯,我正在努力让它工作。也是2。Om不应该是关键词,如果我从你上次的评论中理解你的话。我的输入是Julia,输出实际上是int cnt=1+count(istream_iterator(file),istream_iterator(),word);所以我实际上不希望循环到此结束,因为我需要计算文件中的所有Julia,并且在我的文件中有很多这样的名字。谢谢你的帮助!现在我可以在那个文件中找到Julia,但它只计算一次,然后停在第一次找到名字的那行。既然文件中有10行Julia行(20000行,所有不同的名称),我仍然需要让它循环,知道我该怎么做吗?嗯,我正在努力让它工作。也是2。Om不应该是关键词,如果我从你上次的评论中理解你的话。我的