जबकि डरपैस द्वारा उत्तर निश्चित रूप से सही है, यह अक्सर अप्रत्याशित परिणाम देता है। इसका कारण यह है कि, कम से कम मेरे ऑपरेटिंग सिस्टम (मैक ओएसएक्स 10.9.5) पर, कई टेक्स्ट एडिटर्स अपनी फाइलों को 'एंड लाइन' चरित्र के साथ समाप्त कर देते हैं।
उदाहरण के लिए, जब मैं vim खोलते हैं, तो सिर्फ एक वर्ण 'एक' (कोई वापसी) टाइप करें, और बचाने के लिए, फ़ाइल अब (हेक्स में) में शामिल होंगे:
61 0A
कहाँ 61 अक्षर है 'ए' और 0 ए लाइन वर्ण का अंत है।
इसका मतलब है कि डरपैस द्वारा कोड ऐसे टेक्स्ट एडिटर द्वारा बनाई गई सभी फ़ाइलों पर एक खाली स्ट्रिंग लौटाएगा।
जबकि मैं निश्चित रूप से ऐसे मामलों की कल्पना कर सकता हूं जहां एक 'अंत रेखा' से समाप्त फ़ाइल को खाली स्ट्रिंग वापस करनी चाहिए, मुझे लगता है कि नियमित पाठ फ़ाइलों से निपटने के दौरान अंतिम 'अंत पंक्ति' चरित्र को अनदेखा करना अधिक उपयुक्त होगा; अगर फ़ाइल को 'एंड लाइन' वर्ण से समाप्त कर दिया गया है, तो हम इसे ठीक से अनदेखा करते हैं, और यदि फ़ाइल को 'एंड लाइन' वर्ण से समाप्त नहीं किया गया है तो हमें इसे जांचने की आवश्यकता नहीं है।
इनपुट फ़ाइल का अंतिम वर्ण अनदेखी के लिए मेरे कोड है:
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
int main() {
std::string result = "";
std::ifstream fin("test.txt");
if(fin.is_open()) {
fin.seekg(0,std::ios_base::end); //Start at end of file
char ch = ' '; //Init ch not equal to '\n'
while(ch != '\n'){
fin.seekg(-2,std::ios_base::cur); //Two steps back, this means we
//will NOT check the last character
if((int)fin.tellg() <= 0){ //If passed the start of the file,
fin.seekg(0); //this is the start of the line
break;
}
fin.get(ch); //Check the next character
}
std::getline(fin,result);
fin.close();
std::cout << "final line length: " << result.size() <<std::endl;
std::cout << "final line character codes: ";
for(size_t i =0; i<result.size(); i++){
std::cout << std::hex << (int)result[i] << " ";
}
std::cout << std::endl;
std::cout << "final line: " << result <<std::endl;
}
return 0;
}
कौन सा होगा उत्पादन
:
final line length: 1
final line character codes: 61
final line: a
एकल 'एक' फ़ाइल पर।
संपादित करें: फ़ाइल if((int)fin.tellg() <= 0){
वास्तव में समस्या का कारण बनती है यदि फ़ाइल बहुत बड़ी है (> 2 जीबी), क्योंकि टेलग फ़ाइल (tellg() function give wrong size of file?) की शुरुआत से वर्णों की संख्या को वापस नहीं लौटाता है। फ़ाइल fin.tellg()==tellgValueForStartOfFile
की शुरुआत के लिए अलग-अलग परीक्षण करना और fin.tellg()==-1
त्रुटियों के लिए बेहतर हो सकता है। tellgValueForStartOfFile
शायद 0 है, लेकिन यह सुनिश्चित करने के लिए एक बेहतर तरीका शायद होगा:
fin.seekg (0, is.beg);
tellgValueForStartOfFile = fin.tellg();
क्या कोई * कुछ * है जो किसी के तथ्य में मजबूत है * लगातार * फ़ाइल को संशोधित करता है? आप उस परिस्थिति में "मजबूत" को कैसे परिभाषित करेंगे? –
@ user788171 आप अंत तक खोजना और लाइन टर्मिनेटर के लिए पीछे स्कैन करने में सक्षम होना चाहिए। मैं शायद सुझाव दूंगा कि आप कच्ची फ़ाइल का उपयोग न करें, हालांकि, ऐसा लगता है कि आप एक पाइप चाहते हैं। – oldrinb