2012-10-19 67 views
5

मेरे कोड वर्तमान में कुछ इस तरह (इन चरणों का कई कार्यों में splitted) दिखता है:स्पष्ट/सी में फ़ाइल काटना जब पहले से ही "r +" मोड में खुला

/* open file */ 
FILE *file = fopen(filename, "r+"); 

if(!file) { 

    /* read the file */ 

    /* modify the data */ 

    /* truncate file (how does this work?)*/ 

    /* write new data into file */ 

    /* close file */ 
    fclose(file); 
} 

मैं जानता हूँ कि मैं "w" में साथ फ़ाइल खोलने सकता है मोड, लेकिन मैं इस मामले में ऐसा नहीं करना चाहता हूं। मुझे पता है कि ftruncateunistd.h/sys/types.h में एक फ़ंक्शन है, लेकिन मैं इन फ़ंक्शंस का उपयोग नहीं करना चाहता हूं, मेरा कोड अत्यधिक पोर्टेबल (विंडोज़ पर भी) होना चाहिए।

क्या फ़ाइल को बंद/दोबारा खोलने के बिना फ़ाइल को साफ़ करने की संभावना है? (छद्म कोड)

if(this is linux box) 
use truncate() 
else if (this is windows box) 
use _chsize_s() 

यह आपकी आवश्यकता के लिए सबसे सरल उपाय है:

उत्तर

4

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

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

(fopen (3) आदमी पेज से लिया।)

आपको फ़ाइल नाम पैरामीटर के रूप में एक शून्य सूचक पारित कर सकते हैं:

my_file = freopen(NULL, "w+", my_file); 

आप की जरूरत नहीं है, तो फ़ाइल से अब और पढ़ें, जब "डब्ल्यू" मोड भी ठीक होगा।

+1

ओपी एक मंच स्वतंत्र समाधान चाहता है और फ़ाइल को फिर से खोलना नहीं चाहता है। और अभी भी आर + का उपयोग करें। :) – askmish

+0

@askmish जो संभव नहीं है :-P –

+0

@Nkos: यह संभव है, लेकिन, इष्टतम समाधान वास्तव में जटिल होगा (बफर किए गए तंत्र का उपयोग करके कर्नेल कॉल को शामिल करना), जो ओपी का सवाल ओवरकिल लगता है। :( – askmish

3

आप इस प्रकार का समारोह कुछ लिख सकते हैं।

देखें: आदमी truncate और _chsize_s msdn.microsoft.com

पर और भी आवश्यक हेडर फाइल शामिल हैं।

+0

मुझे पता था कि यह काम करेगा, लेकिन मुझे केवल यह करना है यदि मुझे वास्तव में आवश्यकता है और कोई अन्य तरीका नहीं है। – MarcDefiant