2009-02-25 13 views
12

मैं फ़ाइल पर काम करने के लिए fopen fseeko64 ftello64 ​​fclose आदि का उपयोग कर रहा हूं।फ़ाइल को छेड़छाड़

मैं एक फ़ाइल को कैसे छोटा कर सकता हूं? मुझे पता है कि सी में ऐसा करने का कोई मानक तरीका नहीं है। मैं चाहता हूं कि कोई भी तरीका है जो किसी भी Win32 प्लेटफॉर्म पर काम करेगा। मैं संकलन करने के लिए mingw जीसीसी का उपयोग कर रहा हूँ।

कृपया ध्यान दें: मेरा मतलब है कि फ़ाइल के आकार को निर्दिष्ट आकार में छोटा करें, इसे 0 आकार न बनाएं। और प्रतिलिपि की तरह एक चाल का उपयोग किसी अन्य फ़ाइल में करें और हटाएं/नाम बदलें उचित नहीं है।

+0

क्या आपका मतलब किसी विशिष्ट स्थिति पर छंटनी या खाली फ़ाइल में छंटनी करना था? – paxdiablo

+0

संभव ** ** ** का डुप्लिकेट ** [सी में फ़ाइल को कैसे छीनना है?] (Http://stackoverflow.com/a/873653/2432317) ** –

उत्तर

5

आप शून्य आकार के लिए फ़ाइल को काटना चाहते हैं, आप fopen"w" ध्वज के साथ कर सकते हैं:

FILE *fh = fopen("file.txt","w"); 
if (fh != NULL) fclose(fh); 

मानक सी में विशिष्ट आकार को छोटा करने के लिए, तो आप इस के साथ कर सकते एक स्थानांतरण/नामकरण समाधान, जैसे कुछ:

FILE *finp = fopen ("inp.txt", "rb");  // should check for NULLs 
FILE *fout = fopen ("out.txt", "wb"); 

size_t sz = 100000;       // 100,000 bytes 
char *buff = malloc (sz);     // should check for NULL 

sz = fread (buff, 1, sz, fin);    // should check for errors 
fwrite (buff, 1, sz, fout); 

free (buff); 

fclose (fin); 
fclose (fout); 

rename ("out.txt", "inp.txt);    // should check for error 

बेशक, यदि आपके पास Win32 शीर्षलेख और libra तक पहुंच है ries (और मेरा मानना ​​है कि मिनजीडब्ल्यू आपको यह देता है), आप SetEndOfFile() का उपयोग कर सकते हैं, क्योंकि यह एक नई फ़ाइल बनाने के बजाय इसे स्थान पर रखता है और फिर इसका नाम बदलता है।

इसका मतलब है कि-आधारित के बजाय विंडोज हैंडल-आधारित फ़ाइल I/O का उपयोग करना है, लेकिन यदि आप स्वयं को विंडोज़ में सीमित कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता। यदि आप दूसरी ओर पोर्टेबिलिटी चाहते हैं, तो आपको मानक सी के आधार पर समाधान की आवश्यकता होगी, जैसे उपरोक्त स्थानांतरण/नामकरण समाधान।

+1

आप एक चरित्र के लिए पॉइंटर का उपयोग क्यों कर रहे हैं? आप fgetc() और fputc() का उपयोग कर सकते हैं और केवल एक गैर-सूचक (या एक चर भी नहीं) का उपयोग कर सकते हैं: (int i = 0; i <100000; i ++) fputc (fgetc (fin), fout); –

+0

जिसके परिणामस्वरूप 100,000 गुना अधिक फ़ंक्शन कॉल होंगे :-) – paxdiablo

+0

आह, कुछ गलत पढ़ना था। माफ़ कीजिये। (हालांकि, मुझे नहीं लगता कि 100000 fgetc() s और fputc() वास्तव में उस लंबे समय तक लेते हैं।) –

17

SetEndOfFile()

लेखन पहुँच के साथ फाइल करने के लिए एक संभाल जाओ, फ़ाइल सूचक निर्धारित करते हैं, तो SetEndOfFile फोन()।

FILE *f = fopen("file.txt", "w"); 

इसके अलावा, अगर आप पहले से ही फाइल खोली है, तो आप फ़ंक्शन का उपयोग कर सकते हैं:

-Adam

+1

दुर्भाग्यवश यह नहीं बताता है कि FILE * मान को कैसे परिवर्तित करें ओपी को SetEndOfFile() – Malvineous

+0

पर जाने के लिए उपयुक्त हैंडल में है जो पहले से ही [टिप्पणी में उल्लिखित] (http://stackoverflow.com/questions/584639/truncate-file#comment9468490_584647) [@Malvineous] (http://stackoverflow.com/users/308237/malvineous) द्वारा ... मैं यह ध्यान रखना चाहूंगा कि आप इंगित कर रहे हैं एक *** सी ++ *** फ़ंक्शन, जबकि ओपी ने *** सी *** के बारे में पूछा और स्पष्ट रूप से *** सी *** के साथ प्रश्न को स्पष्ट रूप से टैग किया। –

1

पहले से ही उल्लेख किया है, आप की तरह "w" ध्वज के साथ fopen() का उपयोग कर सकते freopen(), "डब्ल्यू" ध्वज के साथ फिर से:

FILE *f = fopen("file.txt", "r"); //initial fopen() call 
... 
f = freopen("file.txt", "w", f); //reopens "file.txt" and truncates it 

http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html

संपादित करें: यह देखने के बाद कि आपने अपना ओपी संपादित किया है, मैं पहले से ही पैक्स और एडम डेविस को दोबारा नहीं डालूंगा। साथ ही, मैं पुष्टि करूंगा कि पैक्स ने क्या कहा था, कि मिनजीडब्ल्यू आपको Win32 शीर्षकों तक पहुंच प्रदान करता है।

4

फ़ाइल आधारित फ़ाइल संचालन के लिए, फ़ाइल के आकार को बदलने के लिए _fileno() और _chsize_s() का उपयोग करें।

int changesize(FILE *fp, __int64 size) 
{ 
    int filedes = _fileno(fp); 
    return _chsize_s(filedes, size); 
} 

एक truncate संस्करण, मान्य है कि आपूर्ति की आकार वर्तमान फ़ाइल आकार से कम है द्वारा लिखा जा सकता है _chsize_s के रूप में() काटना या एक फ़ाइल के आकार का विस्तार होगा - http://msdn.microsoft.com/en-us/library/whx354w1(VS.80).aspx देखते हैं।

+0

मान लें कि आपके पास माइक्रोसॉफ्ट के रनटाइम तक पहुंच है। –

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