2010-03-06 5 views
31

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

संपादित करें, मैंने fseek विधि का उपयोग करने का प्रयास किया है, लेकिन मुझे यह कहते हुए एक त्रुटि मिलती है कि 'ifstream को FILE * में परिवर्तित नहीं किया जा सकता है'।

fseek(fileDescriptor, 0, SEEK_END); 
if (ftell(fileDescriptor) == 0) { 
    // file is empty... 
} else { 
    // file is not empty, go back to the beginning: 
    fseek(fileDescriptor, 0, SEEK_SET); 
} 

आप फ़ाइल पहले से ही खुला नहीं है, तो, बस fstat समारोह का उपयोग करें:

मेरे समारोह के पैरामीटर

myFunction(ifstream &inFile) 
+0

यह बहुत बुरा है कि आप आसानी से 'fstream' से फ़ाइल डिस्क्रिप्टर नहीं प्राप्त कर सकते हैं। यूनिक्स पर 'fstat' का उपयोग करके आप आसानी से रिक्त फ़ाइल की जांच कर सकते हैं। :-P –

उत्तर

50

शायद कुछ सदृश करने के लिए:

bool is_empty(std::ifstream& pFile) 
{ 
    return pFile.peek() == std::ifstream::traits_type::eof(); 
} 

लघु और मिठाई।


अपने त्रुटि के लिए चिंताओं के साथ, अन्य उत्तर, सी शैली फ़ाइल तक पहुंच जहां विशिष्ट कार्यों के साथ एक FILE* मिलता है।

असल में, आप और मैं सी ++ धाराओं के साथ काम कर रहे हैं, और ऐसे में उन कार्यों का उपयोग नहीं कर सकते हैं। उपर्युक्त कोड एक सरल तरीके से काम करता है: peek() स्ट्रीम पर देखेगा और वापस लौटाएगा, बिना अगले चरित्र को हटाएगा। यदि यह फ़ाइल के अंत तक पहुंचता है, तो यह eof() देता है। Ergo, हम स्ट्रीम पर peek() और देखें कि यह eof() है, क्योंकि एक खाली फ़ाइल में देखने के लिए कुछ भी नहीं है।

नोट, यह भी सच हो जाता है अगर फ़ाइल पहले स्थान पर कभी नहीं खोली गई, जो आपके मामले में काम करनी चाहिए।

std::ifstream file("filename"); 

if (!file) 
{ 
    // file is not open 
} 

if (is_empty(file)) 
{ 
    // file is empty 
} 

// file is open and not empty 
+0

'वापसी pFile.tellg()> 0 || जोड़ने के लिए बहुत कठिन नहीं होगा ... ' – Potatoswatter

+1

क्या जवाब है ... – IssamTP

5

फ़ाइल के अंत तक शोध और स्थिति की जांच है और सीधे फ़ाइल आकार की जांच करें।

0
pFile = fopen("file", "r"); 
fseek (pFile, 0, SEEK_END); 
size=ftell (pFile); 
if (size) { 
    fseek(pFile, 0, SEEK_SET); 
    do something... 
} 

fclose(pFile) 
+1

प्रारूप कोड उपकरण पट्टी बटन है कि '100,110' – t0mm13b

+0

अनाड़ी कोड की तरह दिखता है का उपयोग कर। सिफारिश नहीं की गई। – SmallChess

7

ठीक है, इसलिए कोड का यह टुकड़ा आपके लिए काम करना चाहिए। मैंने आपके पैरामीटर से मेल खाने के लिए नाम बदल दिए।

inFile.seekg(0, ios::end); 
if (inFile.tellg() == 0) {  
    // ...do something with empty file... 
} 
1
char ch; 
FILE *f = fopen("file.txt", "r"); 

if(fscanf(f,"%c",&ch)==EOF) 
{ 
    printf("File is Empty"); 
} 
fclose(f); 
+1

आप सी ++ में इन सी मुहावरों का उपयोग क्यों करेंगे? –

0

कैसे के बारे में (सुरुचिपूर्ण नहीं जिस तरह से हालांकि)

int main(int argc, char* argv[]) 
{ 
    std::ifstream file; 
    file.open("example.txt"); 

    bool isEmpty(true); 
    std::string line; 

    while(file >> line) 
     isEmpty = false; 

     std::cout << isEmpty << std::endl; 
} 
+1

पर्याप्त मेला। यह user4471014 की तुलना में (_actual_ सी ++, नहीं सी होने के कारण), हालांकि अभी भी पूरी तरह से बेकार और suboptimal थोड़ा बेहतर है। –

+0

@ लाइटनेसरेसेसिन ऑर्बिट, आप सही हैं, हालांकि फ़ाइल की सभी लाइनों के माध्यम से जाने की आवश्यकता नहीं है।पहली पंक्ति का पता लगाने के बाद जबकि लूप को रोक दिया जा सकता है और 'isEmpty' को 'false' पर सेट किया जा सकता है। अगर वह कोड को बढ़ा सकता है। – CroCo

+0

मैं समझ सकता हूं कि यह कोड उप-शीर्ष है लेकिन यह अपमानजनक क्यों है? ओपी पर्याप्त या अनुकूलित अनुकूलित कोड नहीं मांग रहा है या नहीं ढूंढ रहा है। – CroCo

-1
if (nfile.eof()) // Prompt data from the Priming read: 
    nfile >> CODE >> QTY >> PRICE; 
else 
{ 
    /*used to check that the file is not empty*/ 
    ofile << "empty file!!" << endl; 
    return 1; 
} 
+1

हालांकि यह ओपी के प्रश्न का समाधान प्रदान कर सकता है, कोड का कोई स्पष्टीकरण नहीं है। –

1

उपयोग इस: data.peek() = '\ 0! आपको लगता है कि नहीं चाहते हैं '

मैं इस सहायता में फाइनल तक एक घंटे की खोज कर रहा हूं!

+0

यह स्वीकार्य उत्तर से बेहतर कैसे है? – Norrius

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

  • कोई संबंधित समस्या नहीं^_^