2016-10-06 4 views
1

Ich verwende diesen Code, um die Standardeingabe zu übernehmen und in eine Zeichenkette einzufügen. dann tokenize die delimeter #Eingabe lesen, bis eine bestimmte Zeichenkette gefunden wird C++

std::string input; 
std::getline(std::cin,input, '\0'); 
std::string delimiter = "#"; 
StringTokenizer strtok(input,delimiter); 

Diese Verwendung macht getline bis Null-Zeichen lesen zu finden ist (glaube ich) und die gesamte Zeichenfolge in input.This funktioniert gut in den Fenstern passieren, wenn ich das cmd laufen und schreiben Sie:

myprogram.exe 0 <testme.txt 

ich die Ausgabe ich expecting.The Problem, das ich habe, ist, wenn ich versuche, einen ähnlichen Befehl in linux-Terminal zu laufen (a.out ist mein Programm)

./a.out < testme.txt 

Es wird nicht looki stoppen ng für die Tastatureingabe, bis ich ctrl-z drücke. Dies ist auch der Fall, wenn ich in meinen IDE Code :: blocks laufe, wo das Programm geschrieben wird. Sowohl Code :: blocks als auch linux kompilieren mit g ++ ohne Fehler oder Warnungen. Ich denke, mein Problem liegt im Warten auf einen Null-Charakter. Der Grund für die Verwendung des Nullzeichens liegt darin, dass meine Eingabe auf mehreren Zeilen ist und wenn ich nur getline (std :: cin, input) verwendet habe, wurde nur die erste Zeile gelesen.

Beispiel testme.txt

A B C D E F # 
A -> Bab # 
B -> C# 
## 

Probe von dem, was ich mit meinem Code mache

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 

Wenn mein Programm die testme.txt durchsetzen sollte mein Programm Ausgang dieses machen:

A B C D E F 
a= 1 
b= 1 

meine Frage

Jede meiner testme.txt-Dateien endet mit den zwei Zeichen ##. Gibt es eine Möglichkeit, die Eingabe zu stoppen, wenn diese Zeichenfolge (?) Erreicht ist, anstatt auf das Nullzeichen zu warten?

+1

'strtok()' ist die schlechteste Option zu wählen. –

+0

ein zweites Trennzeichen mit anderen Zeichen als das erste hinzufügen? – Treycos

+0

warum nicht den Dateinamen übergeben und nur die Datei lesen ?! – deW1

Antwort

1
do{ 
//do stuff 
if (yourString == "##") 
    break; 
}while(yourString != NULL); 

Manchmal ist es einfacher, als es

bearbeiten
Alle Ihre '#' sind nutzlos scheint, wenn man sie löschen:

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; 

Wenn Sie die '#' behalten möchten:

while (std::getline(file, line)) 
    if (!line.find("#")); 
     tokens.push_back(line); 

Wenn Sie std :: cin anstelle einer Datei verwenden:

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

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

Erzähle mir kurz, was dein Programm genau macht – Treycos

+0

mein Programm liest eine Standardeingabe ein und fügt sie in eine Zeichenkette (Eingabe) ein das Trennzeichen # mit strtok. Es ruft dann die Funktion nexttoken() auf und platziert das Token in eine Zeichenfolge.Dann prüft es jedes Token nach tk1, wenn dieses Token einen Kleinbuchstaben enthält und gibt ex aus :(Wenn tk2 "a" enthält, würde es a = 1 usw. ausgeben), endet jede Eingabedatei mit ##. – ddog

+0

Bearbeiten Sie Ihre Post, wenn ich es falsch verstanden habe – Treycos

Verwandte Themen