2016-03-30 10 views
0

Im Programm möchte ich zeilenweise Text aus einer Textdatei einlesen und Daten aus jeder Zeile extrahieren. Jede Zeile in der Textdatei enthält einen Buchstaben wie "A", gefolgt von einem Doppelpunkt ":" gefolgt von einer Ganzzahl wie "2". Die Funktion in dem Programm, das in den Daten sieht derzeit wie folgt lauten:Einlesen von Daten aus einer Textdatei und Trennen der Daten in jeder Zeile

void readFile() 
{ 
std::ifstream aFile;                                             
std::string alldata; 
std::string letter;                             
aFile.open("KeyPopularity.txt"); 
while (std::getline(aFile, alldata)) 
{                           
    letter = alldata[0]; 
    for (int i = 0; i < keyboardKeys.size(); i++) 
    { 
     if (keyboardKeys[i].character==letter)                      
     { 
      keyboardKeys[i].noOfPresses = int(alldata[2]);                   
     } 
     std::cout << letter << " "; 
     std::cout << int(alldata[2]) << "\n"; 
    } 
} 
aFile.clear();                              
} 

jedoch die alldata Variable an Position 0 (alldata [0]) statt Auflistung nur ein einzelnes Zeichen dh dem Buchstaben listet eine Reihe solcher wie 87 vor dem Brief z. 87 W im Gegensatz zu nur W. Die Frage ist, warum passiert das und gibt es eine Möglichkeit, die Daten aus jeder Zeile in der Textdatei Zeile für Zeile zu extrahieren, um den Buchstaben an der Position 0 einer Zeile und die Nummer an der Position zu erhalten 2 der Zeile?

Antwort

1

Einige Beobachtung/Fehler in Ihrem Programm:

  • Brief ist ein std :: string, Sie jedoch ein Zeichen zuweisen; das ist erlaubt, aber bist du dir sicher, dass dies die Absicht ist? Sie können char anstelle von string verwenden.
  • alldata [2] ist ein Zeichen. Für die Zeile "A: 2" beispielsweise lautet der Wert "2" (mit einem ASCII-Wert von 50, der nicht mit dem Wert 2 identisch ist). Sie können es nicht einfach mit int() in int konvertieren. Um ein Zeichen einer Ziffer ('0' .. '9') in den entsprechenden ganzzahligen Wert zu konvertieren, müssen Sie den Wert 48 vom ASCII-Code (oder '0') subtrahieren.
  • auch Art von keyboardKeys ändern [i] .character statt std :: string char

Sie Ihren Code wie folgt umschreiben kann:

void readFile() 
{ 
    std::ifstream aFile; 
    std::string alldata; 
    char letter; 
    aFile.open("KeyPopularity.txt"); 
    while (std::getline(aFile, alldata)) 
    { 
     letter = alldata[0]; 
     for (int i = 0; i < keyboardKeys.size(); i++) 
     { 
      if (keyboardKeys[i].character == letter) 
      { 
       keyboardKeys[i].noOfPresses = alldata[2] - '0'; 
      } 
      std::cout << letter << " "; 
      std::cout << alldata[2] - '0' << "\n"; 
     } 
    } 
    aFile.clear(); 
} 
+0

Eine weitere Beobachtung: wenn die Anzahl der Pressen Lesen Sie aus der Datei ist größer als 9, dann wird der obige Code nicht funktionieren, da es nur die erste Ziffer liest. Sie können den Code so anpassen, dass er die ersten beiden Zeichen von alldata (also den Schlüssel und das ':') entfernt. Sie können dies mit alldata.erase (0, 2) tun. Dann können Sie die resultierende Zeichenfolge konvertieren eine Ganzzahl mit keyboardKeys [i] .noOfPresses = stoi (alldata); Stoi ist jedoch nur in C++ 11 verfügbar, für ältere C++ können Sie das gute alte [atol] (http://www.cplusplus.com/reference/cstdlib/atol/) von stdlib.h verwenden –

Verwandte Themen