2016-03-30 26 views
0

Şu anda programda metin satırındaki metinden satır okumak, her satırdan veri ayıklamak istiyorum. Metin dosyasındaki her satır “A” harfi ve ardından “2” harfi gibi bir harf ve ardından “2” gibi bir tamsayı içerir. verilerdeki okumalı programda fonksiyon şu anda şöyle görünür: 0 konumunda ALLDATA değişken (ALLDATA [0]) yerine harfi yani sadece tek bir karakterin listeleme böyle bir sayısını listeler AncakBir Metin Dosyasındaki Verilerin Okunması ve Her Satırda İçeren Verilerin Ayrılması

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();                              
} 

mektubun önce 87 gibi. Sadece W'ye karşı 87 W Soru şu ki bu bir satır dizisinin 0 pozisyonundaki mektubu ve pozisyondaki sayıyı elde etmek için metin dosyası satırındaki her satırdaki verileri ayıklamak için bir yol var. Satır dizgisi 2?

cevap

1

Bazı gözlem/programınızda hatalar:

  • mektup ancak buna bir karakter atamak, bir std :: dizedir; Bu izin verilir, ancak bu niyetin olduğundan emin misiniz? Dize yerine char kullanabilirsiniz.
  • alldata [2] bir chardır. Örneğin, "A: 2" satırı için, değer '2' olacaktır (ascii değeri 50 ile, bu değer 2 ile aynı değildir). Int() ile int'ye dönüştürebilirsiniz. Bir rakamın bir karakterini ('0' .. '9') ilgili tamsayı değerine dönüştürmek için, 48 değerini ascii kodundan (veya '0') çıkarmanız gerekir.
  • da yerine std char keyboardKeys [i] .character türünü değiştirmek :: dize

Böyle kodunuzu yeniden yazabilirsiniz:

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

Bir daha gözlem: eğer pres sayısı Dosyadan okumak 9'dan büyük, daha sonra yukarıdaki kod işe yaramaz, çünkü sadece ilk rakamı okur. Kodu, ilk iki karakteri alldata'dan (bu nedenle anahtar ve ':') şeritleyecek şekilde ayarlayabilirsiniz, bunu alldata.erase (0, 2) ile yapabilirsiniz. Ardından, sonuç dizesini bir tam sayı, keyboardKeys [i] .noOfPresses = stoi (alldata); Ancak stoi sadece C++ 11'de kullanılabilir, daha eski C++ için stdlib.h eski eski [atol] (http://www.cplusplus.com/reference/cstdlib/atol/) kullanabilirsiniz. –