फ़प्रिंट, प्रिंटफ़ और स्प्रिंटफ़ के बीच अंतर?


233

किसी को भी बीच अंतर के बारे सरल अंग्रेजी में व्याख्या कर सकते हैं printf, fprintfऔर sprintfउदाहरण के साथ?

यह किस धारा में है?

मैं "C में फ़ाइल हैंडलिंग" के बारे में पढ़ते हुए इन तीनों के बीच वास्तव में भ्रमित हूँ।


4
कुछ नमूना कोड लिखकर उनके साथ प्रयोग करें। उनके बीच अंतर को स्पष्ट रूप से समझने का यह बहुत आसान तरीका है ।
नवाज

14
मूर्ख बफर ओवरफ्लो से बचने के लिए स्प्रिंटफ () को स्प्रिंटफ () के लिए प्राथमिकता दें।
मैक्सिम एगोरुस्किन

3
धाराओं या बूस्ट फॉर्मैटर्स को मूर्खतापूर्ण बफर ओवरफ्लो और खराब प्रकार-असमानता से बचने के लिए प्राथमिकता दें
जॉन डिब्लिंग 16

7
@ मैक्सिम, जब तक आप एक वैध बिंदु उठाते हैं, मैं सुरक्षा को ज्ञान में ले जाऊंगा कि मेरे बफ़र्स मेरे ऐप को ओवरफ्लो करने और टुकड़ों में विस्फोट करने के लिए नहीं जा रहे हैं। यदि स्ट्रीम / बूस्ट फॉर्मेटर्स को ध्यान देने योग्य अड़चनों के कारण दिखाया गया है, तो मैं केवल इन कार्यों को देखूंगा। :)
मू-रस

1
@ मोम: बिंदु, कोई आवश्यकता नहीं है। मेरा कोड अड़चन नहीं है। 5m / sec कितने संदेशों को एक्सचेंज भेजता है, न कि कितने हम प्रसंस्करण में सक्षम हैं। तो समय से पहले अनुकूलन क्यों?
जॉन डिब्लिंग

जवाबों:


237

सी में, एक "धारा" एक अमूर्त है; कार्यक्रम के दृष्टिकोण से यह बाइट्स का एक निर्माता (इनपुट स्ट्रीम) या उपभोक्ता (आउटपुट स्ट्रीम) है। यह डिस्क पर एक फ़ाइल, एक पाइप के लिए, आपके टर्मिनल पर, या किसी अन्य डिवाइस जैसे प्रिंटर या ट्टी के अनुरूप हो सकता है। FILEप्रकार स्ट्रीम के बारे में जानकारी शामिल है। आम तौर पर, आप FILEसीधे किसी वस्तु की सामग्री के साथ खिलवाड़ नहीं करते हैं, आप सिर्फ एक संकेतक को विभिन्न I / O रूटीन में पास करते हैं।

तीन मानक धाराएँ हैं: stdinमानक इनपुट स्ट्रीम के stdoutलिए एक सूचक है, मानक आउटपुट स्ट्रीम के stderrलिए एक संकेतक है , और मानक त्रुटि आउटपुट स्ट्रीम के लिए एक सूचक है। एक इंटरैक्टिव सत्र में, तीन आमतौर पर आपके कंसोल को संदर्भित करते हैं, हालांकि आप उन्हें अन्य फ़ाइलों या उपकरणों की ओर इंगित करने के लिए पुनर्निर्देशित कर सकते हैं:

$ myprog < inputfile.dat > output.txt 2> errors.txt

इस उदाहरण में, stdinअब inputfile.dat, को stdoutइंगित करता है output.txt, और को stderrइंगित करता है errors.txt

fprintf आपके द्वारा निर्दिष्ट आउटपुट स्ट्रीम को स्वरूपित पाठ लिखते हैं।

printffprintf(stdout, ...)मानक आउटपुट स्ट्रीम वर्तमान में इंगित कर रहा है, जहाँ भी स्वरूपित पाठ लिखने और लिखने के लिए बराबर है ।

sprintfcharस्ट्रीम के विपरीत, स्वरूपित टेक्स्ट को एक सरणी में लिखते हैं ।


4
"यह बाइट्स का एक निर्माता (इनपुट स्ट्रीम) या उपभोक्ता (आउटपुट स्ट्रीम) है।" क्या ये पीछे हैं? क्या कोई निर्माता (आउटपुट) कुछ नहीं बनायेगा? पूछ रहा हूँ क्योंकि मैं वास्तव में नहीं जानता।
डेव वॉयल्स

6
@DaveVoyles: ये आपके प्रोग्राम के परिप्रेक्ष्य से हैं। एक इनपुट स्ट्रीम आपके प्रोग्राम को पढ़ने के लिए बाइट्स का उत्पादन करता है; एक आउटपुट स्ट्रीम आपके प्रोग्राम से उत्पादित बाइट्स का उपभोग करता है।
जॉन बोडे

153

printfमानक आउटपुट स्ट्रीम ( stdout) के लिए आउटपुट

fprintfफ़ाइल हैंडल पर जाता है ( FILE*)

sprintfआपके द्वारा आवंटित बफर में जाता है। ( char*)


39

प्रिंटफ ("प्रारूप", आर्ग्स) का उपयोग मानक आउटपुट पर डेटा को प्रिंट करने के लिए किया जाता है जो अक्सर एक कंप्यूटर मॉनीटर होता है।

स्प्रिंटफ (चार *, "प्रारूप", आर्ग्स) प्रिंटफ की तरह है। मानक आउटपुट यानी मॉनिटर पर तैयार किए गए स्ट्रिंग को प्रदर्शित करने के बजाय, यह चार्ट सूचक (बहुत पहले पैरामीटर) द्वारा इंगित स्ट्रिंग में तैयार किए गए डेटा को संग्रहीत करता है। स्ट्रिंग स्थान प्रिंटफ और स्प्रिंट सिंटैक्स के बीच एकमात्र अंतर है।

fprintf (FILE * fp, "format", args) फिर से प्रिंटफ की तरह है। यहां मॉनिटर पर डेटा प्रदर्शित करने, या इसे कुछ स्ट्रिंग में सहेजने के बजाय, फॉर्मेट किए गए डेटा को एक फ़ाइल पर सहेजा जाता है, जिसे फ़ाइल पॉइंटर द्वारा इंगित किया जाता है जो कि फ़र्स्टफ़ के पहले पैरामीटर के रूप में उपयोग किया जाता है। फ़ाइल पॉइंटर प्रिंटफ के सिंटैक्स के लिए एकमात्र जोड़ है।

अगर स्टडआउट फ़ाइल को फ़र्स्टफ़ में पहले पैरामीटर के रूप में उपयोग किया जाता है, तो इसका काम तब प्रिंटफ के बराबर माना जाता है।


24

printf(...)के बराबर है fprintf(stdout,...)

fprintf धारा के उत्पादन के लिए प्रयोग किया जाता है।

sprintf(buffer,...) एक स्ट्रिंग को एक बफर में प्रारूपित करने के लिए उपयोग किया जाता है।

नोट वहाँ भी है vsprintf, vfprintfऔरvprintf


vजायके अमानक मुझे विश्वास कर रहे हैं
जॉन Dibling

8
vजायके सी मानक में बहुत निश्चित रूप से कर रहे हैं।
फ्रेड फू

@ लार्समैन: आह, ठीक है। सुधारों के लिए धन्यवाद। यह प्रश्न एक बिंदु पर था [c ++]
जॉन डिबलिंग

2

आप vsnprintf () फ़ंक्शन के साथ बहुत उपयोगी चीजें भी कर सकते हैं:

$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>

struct exception_fmt : std::exception
{
    exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
    char const* what() const throw() { return msg_; }
    char msg_[0x800];
};

exception_fmt::exception_fmt(char const* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vsnprintf(msg_, sizeof msg_, fmt, ap);
    va_end(ap);
}

int main(int ac, char** av)
{
    throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}

$ g++ -Wall -o test test.cc

$ ./test
terminate called after throwing an instance of 'exception_fmt'
  what():  ./test: bad number of arguments 1
Aborted (core dumped)

+1 उपयोगी वास्तव में, लेकिन vsnprintfएक गैर-मानक फ़ंक्शन के बारे में पता होना चाहिए । अधिकांश क्रियान्वयन मैंने इसे या इसके जैसे कुछ को लागू करते हुए देखा है, लेकिन यह कार्यान्वयन-विशिष्ट है।
जॉन डिब्लिंग

1
@ लार्समैन ऊपर उल्लेख करते हैं कि यह वास्तव में, सी मानक का एक हिस्सा है, इसलिए मैं उस को वापस लेता हूं
जॉन डिब्लिंग

2
C के साथ इसका क्या करना है?

2

printf

  1. प्रिंटफ का उपयोग स्क्रीन पर आउटपुट करने के लिए किया जाता है।
  2. वाक्य रचना = printf("control string ", argument );
  3. यह फ़ाइल इनपुट / आउटपुट से संबद्ध नहीं है

fprintf

  1. फ़ाइल के हैंडल द्वारा बताई गई फ़ाइल में लिखने का ऑपरेशन करने के लिए इसका उपयोग किया गया fprintf।
  2. वाक्य-विन्यास है fprintf (filename, "control string ", argument );
  3. यह फ़ाइल इनपुट / आउटपुट के साथ जुड़ा हुआ है

अगर यह कहीं और से उद्धृत किया गया है तो स्रोत को एक लिंक के साथ उद्धृत करना सबसे अच्छा है, लेकिन निश्चित रूप से अभी भी आपके द्वारा उद्धृत पाठ को यहां रखें।
सुपरबीसमैन

0

fprintfयह उन धाराओं से संबंधित है, जैसा printfकि एक कथन के समान है, fprintfलेकिन धाराओं से संबंधित नहीं है, जो fprintfफ़ाइल से संबंधित है


0

स्प्रिंटफ: राइट्स ने स्टैडआउट के बजाय मेमोरी में कैरेक्टर स्ट्रिंग को डेटा फॉर्मेट किया

स्प्रिंट का सिंटैक्स है:

#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);

यहाँ,

स्ट्रिंग सूचक को मेमोरी में एक बफर को संदर्भित करता है जहां डेटा लिखा जाना है।

फ़ॉर्मेट पॉइंटर को संदर्भित करता है प्रारूप को परिभाषित करने वाले चरित्र स्ट्रिंग को।

प्रत्येक आइटम एक चर या अभिव्यक्ति है जो डेटा को लिखने के लिए निर्दिष्ट करता है।

स्प्रिंटफ द्वारा लौटाया गया मान शून्य से अधिक या उसके बराबर होता है यदि ऑपरेशन सफल होता है या दूसरे शब्दों में लिखे गए वर्णों की संख्या, समाप्त करने वाले शून्य वर्ण की गणना नहीं की जाती है और यदि कोई त्रुटि हुई है तो शून्य से कम मान लौटाता है।

प्रिंटफ: प्रिंट्स टू स्टडआउट

Printf के लिए सिंटैक्स है:

printf format [argument]…

स्प्रिंटफ () और प्रिंटफ () के बीच एकमात्र अंतर यह है कि स्प्रिंटफ () एक चरित्र सरणी में डेटा लिखते हैं, जबकि प्रिंटफ () मानक आउटपुट डिवाइस को स्टडआउट करने के लिए डेटा लिखते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.