2012-06-13 18 views
8

मैं कैसे निर्धारित करूं कि फ़ाइल खाली है या नहीं? फ़ाइल को विंडोज प्लेटफार्म पर चल रहे एक सी प्रोग्राम द्वारा खोला गया है। मैं एपेंड मोड में एक फाइल खोलना चाहता हूं, और, यदि खाली है, तो पहले इसे एक हेडर प्रिंट करें।मैं कैसे निर्धारित कर सकता हूं कि कोई फ़ाइल खाली है या नहीं?

// Open CSV & write header 
report_csv = fopen("SNR.csv", "a+"); 
if (!report_csv) { 
    fprintf(stderr, "Unable to open CSV output file..."); 
    return -1; 
} 
if (!ftell(report_csv)) { 
    fprintf(report_csv, "Column A;Column B;Column C\n"); 
} 
// ... print data to file 
fclose(report_csv); 

मैं ftell उम्मीद कर रहा था वर्तमान फ़ाइल आकार वापस जाने के लिए करता है, तो फ़ाइल खाली नहीं था, जो होता है क्योंकि इसके बाद के संस्करण कोड फंस गया है।

हालांकि, ftell हमेशा 0 देता है और शीर्षलेख कई बार मुद्रित होता है।

मैं जानता हूँ कि मैं r साथ यह fopen और a+ साथ fseek/ftell/fclose और फिर fopen इसे फिर से इस्तेमाल कर सकते हैं, लेकिन मुझे लगता है कि खोलने और फ़ाइल को कई बार बंद किए बिना ऐसा करना संभव है।

+0

फ़ाइल I/O संचालन ऑपरेटिंग सिस्टम के बीच भिन्न है, तो ... आप किस ओएस के साथ काम कर रहे हैं? –

+1

'सीएसवी आउटपुट फ़ाइल खोलने में असमर्थ ... 'एक * खराब * त्रुटि संदेश का कैनोलिक उदाहरण है। वास्तविक फ़ाइल नाम, और त्रुटि का कारण ('मैन पेरर' और' मैन स्ट्रेर') शामिल करें। –

+0

@EitanT: यह विंडोज –

उत्तर

6

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

मुझे अपने if (!ftell(report_csv)) से पहले fseek(report_csv, 0, SEEK_END); जोड़ने की आवश्यकता है।

चलो इसे जांचें।
कोड:

#include <stdio.h> 

int main(int argc, char **argv) { 
    FILE *test; 
    size_t size; 
    char buf[100]; 

    /* Truncate file */ 
    test = fopen("test", "w"); 
    if (!test) { 
     fprintf(stderr, "Cannot open file `test`!\n"); 
     return 1; 
    } 

    /* Write something */ 
    fprintf(test, "Something. "); 
    fclose(test); 

    /* Open in append */ 
    test = fopen("test", "a+"); 
    if (!test) { 
     fprintf(stderr, "Cannot open `test` in append mode!\n"); 
     return 1; 
    } 

    /* Try to get the file size */ 
    size = ftell(test); 
    printf("File pointer is: %d\n", size); 
    fseek(test, 0, SEEK_END); 
    size = ftell(test); 
    printf("After `fseek(test, 0, SEEK_END)`, the file pointer is: %d\n", size); 

    /* Append */ 
    fprintf(test, "And that. "); 
    fclose(test); 

    /* Same without fseek */ 
    test = fopen("test", "a+"); 
    if (!test) { 
     fprintf(stderr, "Cannot open `test` in append mode!\n"); 
     return 1; 
    } 
    fprintf(test, "Hello! "); 
    size = ftell(test); 
    printf("File size is now: %d\n", size); 
    fclose(test); 

    /* Try to read */ 
    test = fopen("test", "r"); 
    if (!test) { 
     fprintf(stderr, "Unable to open `test` for reading!\n"); 
     return 1; 
    } 
    printf("File contents:\n\t"); 
    while (test && !feof(test)) { 
     fgets(buf, sizeof(buf), test); 
     printf("%s", buf); 
    } 

    /* Cleanup & exit */ 
    fclose(test); 
    printf("\n\nExiting.\n"); 

    return 0; 
} 

आउटपुट:

File pointer is: 0 
After `fseek(test, 0, SEEK_END)`, the file pointer is: 11 
File size is now: 28 
File contents: 
     Something. And that. Hello! 

Exiting. 
1

आप _stat() पर कॉल कर सकते हैं और st_size पर struct _stat (आपको फ़ाइल खोलने की आवश्यकता नहीं है) प्राप्त करें।
sys/types.h में घोषित sys/stat.h
के बाद मैं Windows प्रोग्रामिंग पता नहीं है, लेकिन यह आपकी मदद कर सकते हैं: http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx

2

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

तो आपको अपने FILE पॉइंटर पर fseek(pFile, 0, SEEK_END) पर कॉल करने की आवश्यकता है।

+0

हाँ यह सही है! मैंने बस दस मिनट पहले यह पाया। बहुत बहुत धन्यवाद। –

+0

पृष्ठ को रीफ्रेश नहीं किया था ... क्षमा करें :) –

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

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