2012-09-17 19 views
5

Bulmak istediğim belirli bir dizenin satır numarasını döndürebilen belirli bir işlev var mı? arandı dize ardından satır numarasını döndürürC++ belirli bir dize için metin dosyası arama ve bu dizgenin bulunduğu satır numarasını döndürme

cout << "found: " << search << endl; 

:

ifstream fileInput; 
int offset; 
string line; 
char* search = "a"; // test variable to search in file 
// open file to search 
fileInput.open(cfilename.c_str()); 
if(fileInput.is_open()) { 
    while(!fileInput.eof()) { 
     getline(fileInput, line); 
     if ((offset = line.find(search, 0)) != string::npos) { 
      cout << "found: " << search << endl; 
     } 
    } 
    fileInput.close(); 
} 
else cout << "Unable to open file."; 

Ben bazı kodları eklemek istiyorum.

cevap

10

Geçerli satır numarasını takip etmek için sadece bir sayaç değişkeni kullanın. getline'u her aradığınızda ... bir satır okuyun ... bu yüzden bundan sonra değişkeni artır. Eğer sonsuz döngü var bu yüzden eof, ayarlanmaz okurken bir hata oluşursa Ayrıca

unsigned int curLine = 0; 
while(getline(fileInput, line)) { // I changed this, see below 
    curLine++; 
    if (line.find(search, 0) != string::npos) { 
     cout << "found: " << search << "line: " << curLine << endl; 
    } 
} 

...

while(!fileInput.eof())

while(getline(fileInput, line))

olmalıdır. std::getline, bir dosyanın (aktardığınız akış), dolaylı olarak bool'a dönüştürülebilen bir akış döndürür; bu, yalnızca dosyanın sonundaysanız, okumaya devam edip edemeyeceğinizi söyler. Eğer vb

+0

arar. Aramak için özel bir fonksiyon olduğunu düşünüyordum .. teşekkürler. –

+0

@JohnMarston: Sorun değil, bu döngü koşulunu değiştirdiğinizden emin olun. Ayakta olduğu gibi, bir hata durumunun üstesinden gelemezsiniz. –

4

değişik bir versiyonu onu okurken eof hala döngü çıkılacak ayarlanır, ama aynı zamanda çıkış örneğin bad ayarlanır olacak, eğer varsa

, birisi dosyayı siler kabul edilen cevap. [Öneri olarak cevap üzerine bir açıklama tercih olurdu ama henüz yorum yapamayız.] Aşağıdaki kod denenmemiş ama belki zor döngü biraz daha küçük hale getirir için

for(unsigned int curLine = 0; getline(fileInput, line); curLine++) { 
    if (line.find(search) != string::npos) { 
     cout << "found: " << search << "line: " << curLine << endl; 
    } 
} 

çalışması (ama gerektiği) okuyun. Ve 0 0 gereksiz varsayılan olarak tüm bu dize yöntemini düşünmedim inanıyorum emin değilim bulmak için varsayılan olarak tüm dize

İlgili konular