2013-11-05 8 views
5

पर फ़ाइल डिस्क्रिप्टर से पढ़ें/लिखें, मैं read(2) और write(2) फ़ंक्शन को फ़ाइल डिस्क्रिप्टर को पढ़ने और लिखने के लिए उपयोग कर रहा हूं।ऑफसेट

क्या ऐसा कोई फ़ंक्शन है जो आपको पढ़ने/लिखने के लिए फ़ाइल में ऑफसेट करने की अनुमति देता है?

उत्तर

3

हां, आप lseek देख रहे हैं।

http://linux.die.net/man/2/lseek

+1

वास्तव में क्या "जिस कारण से" क्या करता है? मैं "छेद" और "डेटा" शब्दों के उपयोग से थोड़ा उलझन में हूं। क्या डेटा गैर-शून्य मान और छेद शून्य मान है? – zaloo

+1

'कहां' ऑफसेट करता है जो ऑफसेट के सापेक्ष है। इसलिए यदि आप 'SEEK_SET' के साथ 10 बाइट्स मांगते हैं, तो यह फ़ाइल की शुरुआत से 10 बाइट्स होगा। यदि आप फिर 'SEEK_CUR' के साथ 6 बाइट्स मांगते हैं, तो यह फ़ाइल की शुरुआत से 16 बाइट्स होगा। – paddy

+0

अंतराल और छेद के बारे में चिंता न करें। वह उस स्थिति से निपट रहा है जहां आप फ़ाइल के अंत से पहले खोजना चाहते हैं। – paddy

0

हाँ, आप उपयोग कर सकते हैं lseek():

off_t lseek(int fd, off_t offset, int whence); 

lseek() समारोह के निर्देश के अनुसार खुले तर्क offse टी करने के लिए फ़ाइल वर्णनकर्ता fd के साथ जुड़े फाइल की भरपाई पुनर्स्थानापन्न whence निम्नानुसार है:

SEEK_SET

ऑफ़सेट बाइट ऑफसेट करने के लिए सेट है।

SEEK_CUR

ऑफसेट अपने वर्तमान स्थान पर सेट प्लस बाइट्स ऑफसेट है।

SEEK_END

ऑफसेट फ़ाइल का आकार करने के लिए सेट के साथ साथ बाइट्स ऑफसेट है।

3

lseek() और आपको प्राप्त होगा।

+4

मैंने सोचा कि यह 'lseek' था और आप' lfind' होगा। इस उत्तर के लिए – paddy

5

हां। आप the same library में lseek फ़ंक्शन का उपयोग करते हैं।

फिर आप फ़ाइल के प्रारंभ या समाप्ति के सापेक्ष किसी भी ऑफसेट की तलाश कर सकते हैं, या वर्तमान स्थान के सापेक्ष।

उस लाइब्रेरी पृष्ठ से अभिभूत न हों। यहां कुछ सरल उपयोग उदाहरण दिए गए हैं और शायद सभी लोगों को कभी भी इसकी आवश्यकता होगी:

lseek(fd, 0, SEEK_SET); /* seek to start of file */ 
lseek(fd, 100, SEEK_SET); /* seek to offset 100 from the start */ 
lseek(fd, 0, SEEK_END); /* seek to end of file (i.e. immediately after the last byte) */ 
lseek(fd, -1, SEEK_END); /* seek to the last byte of the file */ 
lseek(fd, -10, SEEK_CUR); /* seek 10 bytes back from your current position in the file */ 
lseek(fd, 10, SEEK_CUR); /* seek 10 bytes ahead of your current position in the file */ 

शुभकामनाएँ!

8

pread/pwrite कार्यों उस फ़ाइल को स्वीकार ऑफसेट हैं:

ssize_t pread(int fd, void *buf, size_t count, off_t offset); 
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); 
+4

+1। बहु-थ्रेडेड प्रोग्राम्स के लिए, 'प्रीड()' और 'प्राइट()' बेहतर होते हैं, क्योंकि वे फ़ाइल ऑफसेट को प्रभावित नहीं करते हैं (इसलिए एकाधिक थ्रेड बिना किसी लॉकिंग के और बिना किसी लॉकिंग के रेस स्थितियों के एक ही फ़ाइल डिस्क्रिप्टर से पढ़ सकते हैं() 'और 'पढ़ें()')। –

+1

इसके अलावा केवल 1 सिस्टम कॉल! –

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