Saturday 15 February 2014

c - fgetpos() behaviour depends on newline character -


इन दो फाइलों पर गौर करें:

file1.txt (विंडोज़ न्यूलाइन)

  abc \ r \ n def \ r \ n   

file2.txt (यूनिक्स न्यूलाइन)

  एबीसी \ n def \ n   

मैंने ध्यान दिया है कि file2.txt के लिए, fgetpos से प्राप्त स्थिति ठीक से बढ़ी नहीं है मैं विंडोज पर काम कर रहा हूं।

मुझे आपको एक उदाहरण दिखाता हूँ। निम्नलिखित कोड:

  # शामिल है & lt; cstdio & gt; शून्य पढ़ा (फ़ाइल * फ़ाइल) {int c = fgetc (फ़ाइल); Printf ("% c (% d) \ n", (चार) सी, सी); Fpos_t pos; Fgetpos (फ़ाइल, & amp;); // स्थिति को बचाने c = fgetc (फ़ाइल); Printf ("% c (% d) \ n", (चार) सी, सी); Fsetpos (फ़ाइल, & amp;); / स्थिति को पुनर्स्थापित करें - पिछले सी = fgetc (फ़ाइल) को इंगित करना चाहिए; // वर्ण, जो file2.txt printf के लिए मामला नहीं है ("% c (% d) \ n", (char) c, c); C = fgetc (फ़ाइल); Printf ("% c (% d) \ n", (चार) सी, सी); } Int main () {FILE * file = fopen ("file1.txt", "r"); printf ( "file1: \ n"); (फाइल) पढ़ा; fclose (फ़ाइल); File = fopen ("file2.txt", "r"); printf ( "\ n \ nfile2: \ n"); (फाइल) पढ़ा; fclose (फ़ाइल); वापसी 0; }   

ऐसे परिणाम देता है:

  file1: a (97) b (98) b (98) c (99) file2: a (97) B (98) एक (-1) एक (-1)   

file1.txt अपेक्षित काम करता है, जबकि file2.txt अजीब व्यवहार करता है इसके साथ गलत क्या है, यह जानने के लिए मैंने निम्नलिखित कोड की कोशिश की:

  शून्य पढ़ें (फ़ाइल * फ़ाइल) {int c; Fpos_t pos; जबकि (1) {fgetpos (फ़ाइल, & pos); Printf ("pos:% d", (int) pos); C = fgetc (फ़ाइल); यदि (सी == ईओएफ) तोड़; Printf ("c:% c (% d) \ n", (चार) सी, सी); }} Int main () {FILE * file = fopen ("file1.txt", "r"); printf ( "file1: \ n"); (फाइल) पढ़ा; fclose (फ़ाइल); File = fopen ("file2.txt", "r"); printf ( "\ n \ nfile2: \ n"); (फाइल) पढ़ा; fclose (फ़ाइल); वापसी 0; }   

मुझे यह आउटपुट मिला है:

  file1: pos: 0 c: a (97) pos: 1 c: b (98) pos: 2 सी: सी (99) स्थिति: 3 सी: (10) स्थिति: 5 सी: डी (100) स्थिति: 6 सी: ई (101) स्थिति: 7 सी: एफ (102) स्थिति: 8 सी: (10) स्थिति : 10 file2: pos: 0 c: a (97) // कुछ गलत हो रहा है ... pos: -1 c: b (98) pos: 0 c: c (99) pos: 1 c: (10) स्थिति: 3 सी: डी (100) स्थिति: 4 सी: ई (101) स्थिति: 5 सी: एफ (102) स्थिति: 6 सी: (10) स्थिति: 8   

I पता है कि fpos_t को सांकेतिक शब्दों में बदलनेवाला द्वारा व्याख्या नहीं किया जाता है, क्योंकि यह कार्यान्वयन के आधार पर है हालांकि, उपरोक्त उदाहरण में fgetpos / fsetpos

के साथ समस्याओं की व्याख्या की जाती है कि यह कैसे संभव है कि नई लाइन अनुक्रम फाइल की आंतरिक स्थिति को प्रभावित करती है, इससे पहले कि यह वर्णों का मुकाबला करता हो?

मैं कहूंगा कि समस्या शायद दूसरी फ़ाइल को भ्रमित करती है कार्यान्वयन, क्योंकि यह पाठ मोड में खोला जा रहा है, लेकिन यह आवश्यकताओं का पालन नहीं करता है।

मानक में,

एक पाठ स्ट्रीम बनाये गये वर्णों का क्रमबद्ध क्रम है लाइनों में, प्रत्येक पंक्ति जिसमें शून्य या अधिक वर्ण होते हैं और टर्मिनेट करने वाला नया-लाइन वाला चरित्र

आपकी दूसरी फ़ाइल स्ट्रीम में कोई मान्य न्यूलाइन वर्ण नहीं है (क्योंकि यह \ r \ n के लिए दिखता है को आंतरिक रूप से नया रूपांतरित करने के लिए)। नतीजतन, कार्यान्वयन लाइन लंबाई ठीक से नहीं समझ सकता है, और जब आप इसके बारे में आगे बढ़ने की कोशिश करते हैं तो निराश हो जाते हैं। इसके अतिरिक्त,

वर्ण हो सकते हैं

ध्यान रखें कि लाइब्रेरी केवल फ़ाइल से प्रत्येक बाइट को नहीं पढ़ेगा जैसा कि आप fgetc को कॉल करते हैं - यह स्ट्रीम की बफर में पूरी फ़ाइल (एक छोटी सी के लिए) को पढ़कर उस पर कार्य करेगा।

No comments:

Post a Comment