2010-05-26 12 views
6

मैं टेक्स्ट-फ़ाइल से लाइन पढ़ने के लिए निम्न कोड का उपयोग कर रहा हूं। उस मामले को संभालने का सबसे अच्छा तरीका क्या है जहां लाइन SIZE_MAX_LINE सीमा से अधिक है?मैं सी ++ में टेक्स्ट फ़ाइल से लंबी लाइनें कैसे पढ़ूं?

void TextFileReader::read(string inFilename) 
{ 
    ifstream xInFile(inFilename.c_str()); 
    if(!xInFile){ 
     return; 
    } 

    char acLine[SIZE_MAX_LINE + 1]; 

    while(xInFile){ 
     xInFile.getline(acLine, SIZE_MAX_LINE); 
     if(xInFile){ 
      m_sStream.append(acLine); //Appending read line to string 
     } 
    } 

    xInFile.close(); 
} 
+0

मैं वास्तव में चाहता था पता है कि कैसे eofbit को संभालने के लिए और समारोह – sonofdelphi

+1

द्वारा निर्धारित failbit आप std :: तार का उपयोग करते हैं आप आकार सीमा – Nikko

+0

का परीक्षण करने की जरूरत नहीं है क्या क्या एक पठन लाइन का आकार तब होगा? – sonofdelphi

उत्तर

10

istream::getline() का उपयोग न करें। यह नग्न चरित्र बफर से संबंधित है और त्रुटियों के लिए प्रवण है। बेहतर <string> हैडर से std::getline(std::istream&,std::string&, char='\n') का उपयोग करें:

std::string line; 

while(std::getline(xInFile, line)) { 
    m_sStream.append(line); 
    m_sStream.append('\n'); // getline() consumes '\n' 
} 
+0

इस बारे में कैसे? \t istream_iterator कर्सर (xInFile); \t istream_iterator एंडमार्कर; \t जबकि (कर्सर! = एंडमार्कर) { \t m12sStream.append (* कर्सर); \t \t कर्सर ++; \t} – sonofdelphi

+0

@sonofdelphi: IIUC, यह _words_ पढ़ेगा, _lines_ नहीं (जहां "शब्द" व्हाइटस्पेस द्वारा सीमित कुछ भी है)। इसे लाइनों को पढ़ने के लिए, आपको 'std :: istream_iterator' को उस प्रकार के साथ तत्काल करना होगा जो शब्दों के बजाए लाइनों को पढ़ता है। इस तरह के एक प्रकार के साथ आने के लिए मुश्किल नहीं होना चाहिए, लेकिन std lib में कोई भी नहीं है। – sbi

2

आप स्ट्रिंग में free function का उपयोग करते हैं, तो आप एक अधिकतम लंबाई पारित करने के लिए नहीं है। यह सी ++ स्ट्रिंग प्रकार का भी उपयोग करता है।

9

चूंकि आप पहले से ही सी ++ और आईस्ट्रीम का उपयोग कर रहे हैं, तो std::string के getline function का उपयोग क्यों न करें?

std::string acLine; 
while(xInFile){ 
    std::getline(xInFile, acLine); 
    // etc. 
} 

और, xInFile.good() का उपयोग eofbit और badbit और failbit सुनिश्चित करने के लिए नहीं सेट कर रहे हैं।

+2

मैं बस "जबकि (std :: getline (xInFile, acline)) {}" – Nikko

+0

केनी, इनपुट विफल होने पर, यह '// etc' भाग में पुराने डेटा को संसाधित करने का प्रयास करेगा। (यदि स्ट्रिंग फ़ंक्शन के लिए स्थानीय थी, तो कम से कम एक खाली स्ट्रिंग होगी।) निको के मुहावरे का बेहतर उपयोग करें। [मेरा जवाब] देखें (http://stackoverflow.com/questions/2910836/how-do-i-read-long-lines-from-a-text-file-in-c/2911350#2911350)। – sbi

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