2010-09-05 14 views
8

एक फ़ाइल के लिए निम्न आदेश का उपयोग कर खोला जाता है:'ए +' मोड में कोई फ़ाइल खोलने में

FILE *f1=fopen("test.dat","a+"); 

आदमी पेज पर लिखा है:

एक +

पढ़ने और जोड़कर के लिए खुला है (फ़ाइल के अंत में लिखना)। फ़ाइल बनाई गई है यदि यह मौजूद नहीं है। पढ़ने के लिए प्रारंभिक फ़ाइल स्थिति फ़ाइल की शुरुआत में है, लेकिन आउटपुट हमेशा फ़ाइल के अंत में संलग्न है।

तो f1 करता है 2 अलग ऑफसेट संकेत दिए गए, एक को पढ़ने के लिए & लिखने के लिए एक और है?

उत्तर

18

सं

सिर्फ एक सूचक जो शुरू में फ़ाइल की शुरुआत लेकिन जब एक लिखने आपरेशन का प्रयास किया है यह फ़ाइल के अंत तक ले जाया जाता है पर है। आप पढ़ने के लिए फ़ाइल में कहीं भी fseek या rewind का उपयोग करके इसे स्थानांतरित कर सकते हैं, लेकिन लेखन कार्य इसे वापस फ़ाइल के अंत में ले जाएंगे।

+0

यह जानना भी उपयोगी हो सकता है कि यह आमतौर पर POSIX सिस्टम पर O_APPEND ध्वज के साथ 'खुला' के संदर्भ में लागू किया जाता है: http://pubs.opengroup.org/onlinepubs/7908799/xsh/open.html –

+0

इन केस fseek पढ़ने से पहले नहीं कहा जाता है, नीचे दिए गए कोड में बहुत सी रिक्त स्थान मुद्रित की जाती हैं। मैं स्क्रीन पर प्रिंट करने के लिए कुछ भी उम्मीद नहीं कर रहा था। लेकिन किसी भी कारण से रिक्त स्थान मुद्रित किए जाते हैं? इसका मतलब है कि ईओएफ सही ढंग से सामना नहीं किया गया है। अगर मैं नीचे fseek uncomment, डेटा स्क्रीन पर सही ढंग से मुद्रित है। 'int मुख्य() { फ़ाइल * fp1; चार सी; fp1 = fopen ("m.txt", "a +"); फ़ूट ("डेटा संलग्न", fp1); // fseek (fp1,0, SEEK_SET); जबकि ((ch = getc (fp1))! = ईओएफ) { putc (ch, stdout); } fclose (fp1); वापसी 0; } ' –

4

नहीं इसमें केवल एक पॉइंटर है।

3

आप कर सकते हैं कभी नहीं मिश्रण पढ़ने और बीच में fseek बुला के बिना एक FILE पर कार्रवाई लेखन। यह कुछ कार्यान्वयन पर आपकी इच्छा के अनुसार काम कर सकता है, लेकिन इस पर निर्भर एक कार्यक्रम में अपरिभाषित व्यवहार है। इस प्रकार 2 पदों के प्रश्न व्यर्थ हैं।

+0

सच है। हालांकि, यदि आप कभी भी एक ऑपरेटिंग सिस्टम के सी कार्यान्वयन को देखते हैं जो POSIX फ़ाइल संचालन का समर्थन करता है और जहां stdio FILE ऑपरेशंस POSIX वाले (जो * इस मामले में परिभाषित व्यवहार करते हैं) पर पतली बफरिंग परत के अलावा कुछ भी हैं, तो कृपया * उस ओएस के खिलाफ एक बग के रूप में रिपोर्ट करें। –

+0

@ डेराहोपवुड: मैं आप जो कहने की कोशिश कर रहा हूं उसके बारे में उलझन में हूं। एक हस्तक्षेप की तलाश के बिना stdio पर पढ़ने और लिखने की समस्या पूरी तरह से बफरिंग का मुद्दा है। फ़ाइल डिस्क्रिप्टर पर अंतर्निहित संचालन के साथ इसका कोई लेना-देना नहीं है। –

+0

मेरा मतलब है कि मैं एक stdio कार्यान्वयन छोटी गाड़ी पर विचार करता हूं अगर इस मामले में इसके अपरिभाषित व्यवहार के परिणामस्वरूप कुछ भी बदलना पड़ता है, अगर बिल्कुल, buffered डेटा लिखा गया है। यही है, कल्पना यह होनी चाहिए कि परिणामस्वरूप फ़ाइल सामग्री वास्तव में अपरिभाषित व्यवहार की बजाय कार्यान्वयन-परिभाषित हो। अन्यथा आप पाएंगे कि कार्यक्रमों में से एक टन शोषक सुरक्षा बग है। –

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