2012-09-17 8 views
5

पर है, क्या सी ++ में कोई विशेष फ़ंक्शन है जो किसी विशेष स्ट्रिंग की लाइन संख्या को वापस कर सकता है जिसे मैं ढूंढना चाहता हूं?सी ++ किसी विशेष स्ट्रिंग के लिए टेक्स्ट फ़ाइल खोजना और लाइन नंबर वापस करना जहां वह स्ट्रिंग

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."; 

मैं कुछ कोड जोड़ना चाहते हैं।

उत्तर

10

वर्तमान लाइन नंबर का ट्रैक रखने के लिए बस एक काउंटर वैरिएबल का उपयोग करें। प्रत्येक बार जब आप getline पर कॉल करते हैं ... आप एक पंक्ति पढ़ते हैं ... तो उसके बाद चर को बढ़ाएं।

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))

जबकि पढ़ने eof, सेट नहीं किया जाएगा ताकि आप अनंत लूप है एक त्रुटि होती है होना चाहिए। std::getline एक स्ट्रीम (स्ट्रीम जिसे आपने पास किया है) लौटाता है जिसे स्पष्ट रूप से bool में परिवर्तित किया जा सकता है, जो आपको बताता है कि क्या आप पढ़ना जारी रख सकते हैं, न केवल अगर आप फ़ाइल के अंत में हैं।

eof सेट किया गया है तो आप अभी भी पाश बाहर निकल जाएगा, लेकिन आप भी बाहर निकलते हैं, उदाहरण के लिए, bad सेट कर दिया जाता है तो किसी फ़ाइल को हटा देता है, जबकि आप, यह पढ़ रहे हैं आदि

+0

ओह, मुझे विश्वास नहीं है कि मैंने उस साधारण काउंटर विधि के बारे में नहीं सोचा था। मैं सोच रहा था कि कॉल करने के लिए एक विशेष समारोह है .. धन्यवाद मैंने इसे हल किया। –

+0

@ जॉन मार्स्टन: कोई समस्या नहीं, सुनिश्चित करें कि आप उस लूप स्थिति को बदल दें। जैसा कि यह खड़ा है कि आप एक त्रुटि स्थिति को संभाल नहीं सकते हैं। –

4

का एक संशोधित संस्करण स्वीकार्य उत्तर [एक सुझाव के रूप जवाब पर एक टिप्पणी बेहतर होता है, लेकिन मैं अभी तक कोई टिप्पणी नहीं कर सकते हैं।] निम्नलिखित कोड अपरीक्षित है, लेकिन यह करने के लिए

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

काम करना चाहिए पाश यह थोड़ा छोटा बनाता है के लिए (लेकिन शायद कठिन पढ़ें)। और find में 0 अनावश्यक होना चाहिए क्योंकि डिफ़ॉल्ट रूप से खोजें पूरी स्ट्रिंग

संबंधित मुद्दे