2016-03-24 4 views
-2

Ich suchte nach Hilfe zu einem Problem. Ich muss bestimmte "Passwörter" aus einer .txt-Datei wie "abE13 #" lesen und einige einfache Fehlerprüfungen durchführen, um sicherzustellen, dass sie bestimmte Anforderungen erfüllen. Aber im Moment druckt es die Passwörter aus (was gemacht werden soll), aber es ignoriert die Überprüfung und bleibt in einer Schleife stecken, in der neue Zeilen ausgedruckt werden. Ich bin mir sicher, dass es etwas mit while(ch!='\n') zu tun hat, aber ich bin mir nicht ganz sicher, was dort an Ort und Stelle zur Überprüfung benötigt wird.Probleme mit dem Lesen von einer TXT-Datei C++

ch = inFile.get(); 
while(!inFile.eof()) 
{ 
    while(ch != '\n') 
    { 
    cout << ch; 
    if(isalpha(ch)) 
     { 
      charReq++; 
      if(isupper(ch)) 
       uppercaseReq++; 
      else 
       lowercaseReq++; 
     } 
    else if(isdigit(ch)) 
     { 
      charReq++; 
      digitReq++; 
     } 
    else if(isSpecial(ch)) 
     { 
      charReq++; 
      specialCharReq++; 
     } 
    if(uppercaseReq < 1) 
      cout << "\n missing uppercase" << endl; 
    ch = inFile.get(); 
    } 
} 

es angenommen hat, Art, dieses Format zu folgen,

Read a character from the password.txt file 

while(there are characters in the file) 
{ 
while(the character from the file is not a newline character) 
{ 
Display the character from the file 

Code a cascading decision statement to test for the various required characters 

Increment a count of the number of characters in the password 

Read another character from the password.txt file 
} 

Determine if the password was valid or not. If the password was invalid, 
display the things that were wrong. If the password was valid, display that it 
was valid. 

Read another character from the file (this will get the character after the 
newline character -- ie. the start of a new password or the end of file) 
} 

Display the total number of passwords, the number of valid passwords, and the 
number of invalid passwords 

+1

Willkommen bei Stack Overflow! Es klingt, als müssten Sie lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+0

Sie haben _'while (inFile) '_. Ich denke [Warum wird Iostream :: eof in einem Loop-Zustand als falsch angesehen?] (Http://stackoverflow.com/questions/5605125/why-isostreameof-inside-a-loop-condition-con- sidered-wrong) ist schwer verbunden. –

+0

'cout << ch;' gibt alle Zeichen aus, während sie gelesen werden. Aus diesem Grund werden die Passwörter gedruckt –

Antwort

-1
while(the character from the file is not a newline character) 

Sie diese Zeile von Pseudo-Code in dieser Zeile von C++ Code umgewandelt haben:

while (ch != '\t') 

'\t' ist das Tab-Zeichen, nicht das Newline-Zeichen. Dies könnte definitiv Probleme verursachen, warum Sie nie enden und stattdessen nur neue Zeilen drucken (Really EOF, aber Sie sehen das nicht).

'\n' ist das Newline-Zeichen.

Probieren Sie es aus.

EDIT:

Auch Ihr nur für eine ganze ifstream Überprüfung als falsch. Ich weiß nicht genau, wann das passieren würde, aber ich würde empfehlen, nach dem EOF-Flag zu suchen. Der Code sollte entlang der Linien von dieser in etwas verwandeln:

while(!inFile.eof()) 
{ 
    while(ch != '\n' && !inFile.eof()) 
    { 
     // ... 
    } 
} 
+0

Nach dem Ändern, wird es immer noch die Passwörter ausdrucken, aber es geht immer noch in die Schleife, wo neue Zeilen gerade ausgedruckt werden. – kenny10009

+0

Welcher Variablentyp ist inFile? Ist es nur eine Datei *? oder es ein C++ 11 Konstrukt? – Cmoraski

+0

Nicht sicher, ich verstehe vollständig, was Sie meinen, wie in was in der .txt ich öffne? – kenny10009

0

Es hält Drucke wegen dieser while(inFile). Das ist immer wahr. Ändern Sie ihn zu einer if-Anweisung nur zu prüfen, ob Datei geöffnet ist:

if (inFile) 

EDIT: Es wird beim ersten Passwort stoppen, weil dieser while(ch != '\n'). Wenn er das Ende des ersten Passworts erreicht, wird ch '\ n' sein, während es fehlschlägt und das Lesen stoppt. Ändern Sie es zu:

+0

Ich habe das versucht, aber es scheint nur das erste Passwort auszudrucken, und nicht der Rest. – kenny10009

+0

Sehen Sie sich meine Bearbeitung an – DimChtz

+0

@ kenny10009 Mit diesen Änderungen würde es korrekt drucken – DimChtz

-1

Wenn Sie nicht zweimal auf infile überprüfen, können Sie in einer Endlosschleife enden.

while(infile.good()) 
{ 
    while (inFile.good() && ch != '\n') 
    { 
    ... 
    } 
    if (ch == '\n') 
    {...} 
    else 
    {...} 
}