C++ 读取输入,直到找到特定字符串C++;

C++ 读取输入,直到找到特定字符串C++;,c++,linux,string,C++,Linux,String,我目前正在使用此代码接收标准输入并将其放入字符串中。然后使用delimeter标记化# 这会使getline一直被读取,直到找到空字符为止(我想),并将整个字符串传递到输入中。当我运行cmd并编写以下命令时,这在windows中运行良好: myprogram.exe 0 <testme.txt 我正在用我的代码做什么的示例 std::string data; std::getline(std::cin,data, '\0'); std::string delimiter = "#"; S

我目前正在使用此代码接收标准输入并将其放入字符串中。然后使用delimeter标记化#

这会使getline一直被读取,直到找到空字符为止(我想),并将整个字符串传递到输入中。当我运行cmd并编写以下命令时,这在windows中运行良好:

myprogram.exe 0 <testme.txt
我正在用我的代码做什么的示例

std::string data;
std::getline(std::cin,data, '\0');
std::string delimiter = "#";
StringTokenizer strtok(data,delimiter);
// places first token in tk1
std::string t1      = strtok.nextToken();
std::string tk1(t1);
// places next token in tk2
std::string t2      = strtok.nextToken();
std::string tk2(t2);
if(checkstring(tk2,"a") > 0) // this function checks the amount of "a"s in the token. I only care if there is at least 1 "a" so that is what the if statements are for.
    {
      a = a + 1;
    }
// do this if statement for every letter
// example: token = A -> abbbababababa then will print out a = 1 and b = 1
如果通过我的程序,testme.txt应使我的程序输出如下:

 A B C D E F
 a= 1
 b= 1
我的问题

我的每个testme.txt文件都以两个字符##结尾。是否有一种方法可以在到达该字符串(?)时停止读取输入,而不是等待空字符

do{
//do stuff
if (yourString == "##")
    break;
}while(yourString != NULL);
有时候比看起来容易

编辑
如果删除所有的“#”,则它们都是无用的:

std::vector<std::string> tokens; // Storing all tokens
std::string line;
while (std::getline(file, line))
    tokens.push_back(line);

for (std::string s : tokens) //Gets all tokens one by one
    for (char c : s)// Gets all char in each token
        if (islower(c))// Checks if thats a lowercase letter
            std::cout << c << std::endl;
如果使用std::cin而不是文件:

std::string input, line;
std::cin >> input;
std::stringstream sinput(input);

while (std::getline(sinput, line, '#'))
    tokens.push_back(line);

strtok()
是最糟糕的选择。添加一个与第一个分隔符字符不同的第二个分隔符?为什么不传递文件名并读取文件@deW1我需要接受标准输入,这样我就不知道txt的名称了。它必须适用于任何标准输入。你能更准确地告诉我你想要什么吗?简单地告诉我你的程序exaclty做什么。我的程序读取标准输入并将其放入字符串(输入),然后使用strtok通过分隔符对该字符串进行标记。然后调用函数nexttoken(),并将令牌放入字符串中。然后检查tk1之后的每个令牌是否包含小写字母,并输出ex:(如果tk2包含“a”,则输出a=1等)每个输入文件以##结尾。我认为唯一需要更改的是我在输入中读取的方式。getline(std::string,input,“\0”)似乎从未停止寻找输入,因为它找不到\0。有没有一种方法可以让getline()或其他函数在看到##而不是getline()本身时停止查找输入,但是当getline()修改的字符串等于“##”时可以停止查找输入,就像在我的第一个答案中一样,还有,getline()在它读取的文件末尾返回一个空指针,如果(std::cin==“##”)我会写什么或者我会把输入放在那里?此外,我还收到以下错误“与‘运算符!=’不匹配”
do{
//do stuff
if (yourString == "##")
    break;
}while(yourString != NULL);
std::vector<std::string> tokens; // Storing all tokens
std::string line;
while (std::getline(file, line))
    tokens.push_back(line);

for (std::string s : tokens) //Gets all tokens one by one
    for (char c : s)// Gets all char in each token
        if (islower(c))// Checks if thats a lowercase letter
            std::cout << c << std::endl;
while (std::getline(file, line))
    if (!line.find("#"));
        tokens.push_back(line);
std::string input, line;
std::cin >> input;
std::stringstream sinput(input);

while (std::getline(sinput, line, '#'))
    tokens.push_back(line);