2010-06-24 12 views
7

मैं निम्नलिखित कोड, Suse 10.1 पर चल रहा है/जी ++ 4.1.0, और यह फ़ाइल पर लिखने नहीं है:ofstream फ्लश नहीं है

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world"; 
} 

फ़ाइल सही तरीके से बनाया है और खोला जाता है, लेकिन खाली है। अगर मैं करने के लिए कोड बदलने के लिए:

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world\n"; 
} 

(पाठ करने के लिए एक \n जोड़ने), यह काम करता है। मैंने भी स्ट्रीम की फ्लश करने की कोशिश की, लेकिन यह काम नहीं किया।

कोई सुझाव?

+2

आप परिणामी फ़ाइल की जांच कैसे करते हैं? – log0

+1

जी ++ 4.4.4 के साथ डेबियन/सिड पर प्रोग्राम अपेक्षित के रूप में काम करता है और file.out में स्ट्रिंग (न्यूलाइन के बिना) होती है। अपने कंपाइलर या ओएस को अपडेट करने का प्रयास करें - दोनों पुराने हैं। – Dummy00001

+1

फ़ाइल कैसे खाली है या नहीं, तो आप कैसे जांच रहे हैं?परिणामस्वरूप फ़ाइल पर ऐसा करें: wc और देखें कि आउटपुट क्या है। यह 0 2 11. 0 लाइन, 2 शब्द, 11 अक्षर होना चाहिए। नई लाइन के बिना, आउटपुट "हैलो वर्ल्ड" आपके प्रॉम्प्ट में चलेगा, इसलिए आप इसे याद कर सकते हैं। –

उत्तर

7

यदि आप अपनी फ़ाइल को cat कर रहे हैं, तो यह आपका खोल हो सकता है जो गलत तरीके से कॉन्फ़िगर किया गया है और लाइन का कोई अंत नहीं होने पर लाइन मुद्रित नहीं करता है।
std::endl\nऔर फ्लश जोड़ता है।

+3

हाँ, 'बिल्ली फ़ाइल करने का प्रयास करें; echo'। हालांकि 'अंतहीन' का ध्यानपूर्वक उपयोग न करें। मुझे उस कोड से नफरत है जो उस बेवकूफ निर्माण का उपयोग करता है और मैं चाहता हूं कि मानक मानक से इसे हटा दें। फ्लशिंग महंगा है, और हमेशा जागरूक और पूर्व विचार के साथ किया जाना चाहिए। – Omnifarious

+0

समस्या मेरे काम में उपयोग की जाने वाली छोटी गाड़ी संपादक थी जो अंत में कोई '\ n' नहीं होने पर लाइन नहीं दिखाती है। जाहिर है, वीआई इसे सही दिखाता है। धन्यवाद। –

0

file << "Hello world" << std::endl; 

काम करता है?

एंडल एक नई लाइन डालने और बफर को फ्लश करता है। क्या आप उस बात का जिक्र कर रहे थे जब आपने कहा था कि आप इसे पहले से ही फ़्लश करने की कोशिश कर रहे हैं? अगर यह है

4

जानते हैं न कि तुम क्या करने की कोशिश की लेकिन आपको क्या करना चाहिए:

file << "Hello World" << std::flush; 

अद्यतन; मैं उपयोगी टिप्पणी

प्रतिक्रिया के आधार पर की वजह से यहां इस जवाब जा रहा हूँ, मैं मेरी सलाह संशोधित करेंगे: आप स्पष्ट रूप से (उस बात के लिए या file.close()) std::flush कॉल करने के लिए नहीं होना चाहिए, क्योंकि नाशक करता है तुम्हारे लिए।

इसके अतिरिक्त, फ्लश को कॉल करना स्पष्ट रूप से एक I/O ऑपरेशन को मजबूर करता है जो सबसे अनुकूलित तरीका नहीं हो सकता है। अंतर्निहित iostreams और ऑपरेटिंग सिस्टम के लिए अन्याय बेहतर होगा।

स्पष्ट रूप से ओपी का मुद्दा std::flush पर कॉल करने या कॉल करने से संबंधित नहीं था, और शायद फ़ाइल स्ट्रीम विनाशक कहने से पहले फ़ाइल को पढ़ने का प्रयास करने के कारण था।

+2

'ऑफस्ट्रीम' विनाशक स्वचालित रूप से फ्लश होना चाहिए। – Omnifarious

+0

@ ओमनिफरीस: वह एक डाउनवोट का हकदार है? क्या मेरा जवाब * गलत * है? –

+1

@ जॉन वेल्डन - यह गलत है क्योंकि यह वास्तव में ओपीएस वास्तविक समस्या को संबोधित नहीं करता है। यह डिबगिंग और वास्तविक समस्या क्या है (और एक टिप्पणी के लिए होना चाहिए) में यह उपयोगी हो सकता है, लेकिन यह स्वयं में कोई समाधान नहीं है। यदि यह एक समाधान के रूप में है तो यह एक कार्गो-पंथ शैली समाधान का सुझाव देता है जिसमें कोई समझने के बिना कोड डालता है कि उसे वहां क्यों होना चाहिए। – Omnifarious

4

विनाशक को फ़ाइल को फ्लश और बंद करना चाहिए।

मैं बहुत यकीन है, त्रुटि, एक अन्य जगह है या तो

1) आप समय में सही बिंदु पर जांच नहीं करते। किस बिंदु पर आप फ़ाइल की सामग्री की तुलना करते हैं, "बाहर निकलने के बाद", या प्रोग्राम से बाहर निकलने से पहले आप ब्रेकपॉइंट सेट करते हैं और फिर आप फाइल सामग्री की जांच करते हैं?

2) किसी भी तरह से प्रोग्राम बाहर निकलने से पहले दुर्घटनाग्रस्त हो जाता है?

+0

हाँ, यदि कार्यक्रम चलाया जाता है और इसे पूरी तरह समाप्त होने के बाद और आपको अपना प्रॉम्प्ट वापस मिल जाता है तो इसमें डेटा नहीं होता है, वहां कहीं भी एक बग है। – Omnifarious