2009-06-20 10 views
20

मैं सी ++ में एक अस्थायी पाठ फ़ाइल बनाने की कोशिश कर रहा हूं और फिर प्रोग्राम के अंत पर इसे हटा दूंगा। मुझे Google के साथ बहुत भाग्य नहीं मिला है।सी ++ में अस्थायी टेक्स्ट फ़ाइल कैसे बनाएं?

क्या आप मुझे बता सकते हैं कि कौन से फ़ंक्शंस का उपयोग करना है?


नीचे दिए गए उत्तर मुझे बताएं कि एक temp फ़ाइल कैसे बनाएं। क्या होगा अगर मैं सिर्फ फ़ाइल (tmp.txt) बनाना चाहता हूं और फिर इसे हटा दूं? मुझे यह कैसे करना है?

+0

और फिर फ़ाइल के अंत में इसे हटा दें? – Tom

+0

हां। अस्थायी फ़ाइल में केवल अस्थायी डेटा होगा। आउटपुट को मौजूदा output.txt फ़ाइल में लिखा जाएगा। – Meir

+0

http://www.cplusplus.com/doc/tutorial/files/ – g06lin

उत्तर

21

हो सकता है कि इस में मदद मिलेगी

FILE * tmpfile (void); 

http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

ओपन अस्थायी फ़ाइल

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

भी देखें

char * tmpnam (char * str); 

अस्थायी फ़ाइल नाम

एक फ़ाइल नाम किसी भी मौजूदा फ़ाइल से अलग वाली एक स्ट्रिंग उत्पन्न है उत्पन्न करें। इस स्ट्रिंग का उपयोग पर किया जा सकता है बिना किसी अन्य मौजूदा फ़ाइल को ओवरराइट करने के बिना एक अस्थायी फ़ाइल बनाएं।

http://www.cplusplus.com/reference/clibrary/cstdio/tmpnam/

+0

बहुत अच्छा लगता है। धन्यवाद। मैं इसे आज़मा रहा हूं ... – Meir

+4

यह उल्लेखनीय है कि कुछ संदर्भों में tmpfile() और tmpnam() के साथ समस्याएं हो सकती हैं जैसे http://www.codeproject.com/KB/web-security/TemporaryFileSecurity। एएसपीएक्स – jfs

+2

बम्फफाइल, निश्चित रूप से, सी फ़ाइल संभाल लौटने की समस्या है, सी ++ स्ट्रीम नहीं। – rlbond

2

आप (उदाहरण के लिए, ताकि आप किसी अन्य प्रक्रिया है, शायद एक संकलक या संपादक को नाम पारित कर सकते हैं) एक नाम की फ़ाइल की जरूरत है, तो एक सफाई समारोह है कि atexit() साथ फ़ाइल को निकाल देता रजिस्टर। फ़ाइल बनाने के लिए आप सी ++ <iostream> या सी FILE * (<cstdio>) का उपयोग कर सकते हैं। पूरी तरह से मानक नहीं बल्कि व्यापक रूप से उपलब्ध mkstemp() फ़ंक्शन एक फ़ाइल बनाता है और आपको इसका नाम बताता है और फ़ाइल डिस्क्रिप्टर (तीसरा I/O तंत्र) लौटाता है; आप फाइल डिस्क्रिप्टर को FILE * में कनवर्ट करने के लिए fdopen() फ़ंक्शन का उपयोग कर सकते हैं।

यदि आपको नामित फ़ाइल की आवश्यकता नहीं है तो सी-शैली FILE * ठीक है, तो @Tom द्वारा सुझाए गए अनुसार tmpfile() देखें।

19

यहां एक संपूर्ण उदाहरण है:

#include <unistd.h> 

int main(void) { 
    char filename[] = "/tmp/mytemp.XXXXXX"; // template for our file.   
    int fd = mkstemp(filename); // Creates and opens a new temp file r/w. 
           // Xs are replaced with a unique number. 
    if (fd == -1) return 1;  // Check we managed to open the file. 
    write(fd, "abc", 4);   // note 4 bytes total: abc terminating '\0' 
    /* ... 
    do whatever else you want. 
    ... */ 
    close(fd); 
    unlink(filename);    // Delete the temporary file. 
} 

आप फ़ाइल आप बनाना चाहते हैं का नाम जानते हैं (और यकीन है कि यह पहले से ही मौजूद नहीं होगा) तो आप स्पष्ट रूप से सिर्फ open उपयोग कर सकते हैं फ़ाइल खोलने के लिए ।

tmpnam और tmpfile शायद उन्हें बचाया जाना चाहिए क्योंकि वे दौड़ की स्थिति से पीड़ित हैं - man tmpfile(3) विवरण के लिए देखें।

+1

mkstemp (3) के लिए लिनक्स मैन पेज का कहना है कि फ़ाइल नाम में अंतिम 6 वर्ण XXXXXX होना चाहिए। Http://www.kernel.org/doc/man-pages/online/pages/man3/mkstemp.3.html – jfs

+0

हम्म, mkstemp के लिए ओएस एक्स मैनपेज कहता है कि आपके पास XXX की एक चर संख्या हो सकती है। हालांकि स्पष्टता के हित में (और 'अधिकांश लोग शायद लिनक्स का उपयोग कर रहे हैं) मैंने उपर्युक्त उदाहरण बदल दिया है। – DaveR

+0

दरअसल यह mktemp और tmpnam है जो आपके द्वारा उल्लेख की जाने वाली दौड़ स्थितियों से पीड़ित है, tmpfile नहीं। tmpfile एक सी फ़ाइल हैंडल देता है, इसलिए आपको सी ++ स्ट्रीम नहीं मिलेगी, लेकिन आपको दौड़ की स्थिति भी नहीं मिलती है। मुझे लगता है कि ऊपर दिए गए मैन पेज जिन्हें आप संदर्भित करना चाहते हैं tmpname (3) http://www.kernel.org/doc/man-pages/online/pages/man3/tmpnam.3.html और mktemp http: // www के लिए हैं .kernel.org/डॉक्टर/मैन-पेज/ऑनलाइन/पेज/मैन 3/mktemp.3.html –

0

ठीक है, मानते हुए कि आप अस्थायी फ़ाइल बनाने में सफल रहे हैं, आप इसे हटाने के लिए निकालें फ़ंक्शन का उपयोग कर सकते हैं।

समारोह stdio.h में घोषित किया जाता है -

#include <stdio.h> 

int remove(const char *pathname); 

उदाहरण के लिए, यदि आप कोड myfile.txt नाम की एक फ़ाइल को नष्ट करना चाहते हो जाएगा

#include<stdio.h> 

int main() 
{ 
    if(remove("myfile.txt") == -1) 
    { 
    fprintf(stderr,"Remove failed"); 
    exit(EXIT_FAILURE); 
    } 
    exit(EXIT_SUCCESS); 
} 

मैं अब तक आशा, आप पहले ही जानते हैं कि temp फ़ाइल कैसे बनाएं, इसलिए यह आपकी क्वेरी को हल करना चाहिए। उम्मीद है कि यह मदद करता है।

1

मुझे आश्चर्य है कि आप में से अधिकांश लोगों ने उसे सी ++ तरीके के बजाय ऐसा करने का सी तरीका क्यों दिखाया।
यहां fstream है।
कोशिश करें, फ़ाइल को हटाने से ओएस निर्भर है लेकिन आप चीजों को आसान बनाने के लिए boost.filesystem का उपयोग कर सकते हैं।

+2

ऐसा शायद इसलिए है क्योंकि ओपी ने एक अस्थायी फ़ाइल मांगी है, और एक अद्वितीय फ़ाइल नाम बनाने के लिए कोई मानक सी ++ तंत्र नहीं है। LibstdC++ या बूस्ट में कुछ भी नहीं है जो वास्तव में mkstemp() को प्रतिस्थापित करता है। – Tom

5

यह एक छोटा सा विषय हो सकता है क्योंकि लेखक एक tmp.txt बनाना चाहता था और इसका उपयोग करने के बाद इसे हटा देना चाहता था, लेकिन यह छोटा है - आप इसे खोल सकते हैं (इसे) खोल सकते हैं और इसे हटा सकते हैं (बूस्ट :: फाइल सिस्टम का उपयोग कर बेशक)।

mkstemp() यूनिक्स आधारित है। विंडोज़ के साथ आप एक temp फ़ाइल के लिए पथ उत्पन्न करने के लिए GetTempFileName() और GetTempPath() का उपयोग करते हैं। MSDN से नमूना कोड:

http://msdn.microsoft.com/en-us/library/aa363875%28VS.85%29.aspx

3

लिनक्स पर (कर्नेल 3.11 से शुरू), वहाँ झंडा खोलने के लिए (2) O_TMPFILE कि है कि एक नाम नहीं है एक अस्थायी फ़ाइल बनाता है (यानी यह दिखाई नहीं देता फाइल सिस्टम में ऊपर)। इसमें कुछ रोचक विशेषताएं हैं:

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