किसी को भी बीच अंतर के बारे सरल अंग्रेजी में व्याख्या कर सकते हैं printf
, fprintf
और sprintf
उदाहरण के साथ?
यह किस धारा में है?
मैं "C में फ़ाइल हैंडलिंग" के बारे में पढ़ते हुए इन तीनों के बीच वास्तव में भ्रमित हूँ।
किसी को भी बीच अंतर के बारे सरल अंग्रेजी में व्याख्या कर सकते हैं printf
, fprintf
और sprintf
उदाहरण के साथ?
यह किस धारा में है?
मैं "C में फ़ाइल हैंडलिंग" के बारे में पढ़ते हुए इन तीनों के बीच वास्तव में भ्रमित हूँ।
जवाबों:
सी में, एक "धारा" एक अमूर्त है; कार्यक्रम के दृष्टिकोण से यह बाइट्स का एक निर्माता (इनपुट स्ट्रीम) या उपभोक्ता (आउटपुट स्ट्रीम) है। यह डिस्क पर एक फ़ाइल, एक पाइप के लिए, आपके टर्मिनल पर, या किसी अन्य डिवाइस जैसे प्रिंटर या ट्टी के अनुरूप हो सकता है। 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
आपके द्वारा निर्दिष्ट आउटपुट स्ट्रीम को स्वरूपित पाठ लिखते हैं।
printf
fprintf(stdout, ...)
मानक आउटपुट स्ट्रीम वर्तमान में इंगित कर रहा है, जहाँ भी स्वरूपित पाठ लिखने और लिखने के लिए बराबर है ।
sprintf
char
स्ट्रीम के विपरीत, स्वरूपित टेक्स्ट को एक सरणी में लिखते हैं ।
प्रिंटफ ("प्रारूप", आर्ग्स) का उपयोग मानक आउटपुट पर डेटा को प्रिंट करने के लिए किया जाता है जो अक्सर एक कंप्यूटर मॉनीटर होता है।
स्प्रिंटफ (चार *, "प्रारूप", आर्ग्स) प्रिंटफ की तरह है। मानक आउटपुट यानी मॉनिटर पर तैयार किए गए स्ट्रिंग को प्रदर्शित करने के बजाय, यह चार्ट सूचक (बहुत पहले पैरामीटर) द्वारा इंगित स्ट्रिंग में तैयार किए गए डेटा को संग्रहीत करता है। स्ट्रिंग स्थान प्रिंटफ और स्प्रिंट सिंटैक्स के बीच एकमात्र अंतर है।
fprintf (FILE * fp, "format", args) फिर से प्रिंटफ की तरह है। यहां मॉनिटर पर डेटा प्रदर्शित करने, या इसे कुछ स्ट्रिंग में सहेजने के बजाय, फॉर्मेट किए गए डेटा को एक फ़ाइल पर सहेजा जाता है, जिसे फ़ाइल पॉइंटर द्वारा इंगित किया जाता है जो कि फ़र्स्टफ़ के पहले पैरामीटर के रूप में उपयोग किया जाता है। फ़ाइल पॉइंटर प्रिंटफ के सिंटैक्स के लिए एकमात्र जोड़ है।
अगर स्टडआउट फ़ाइल को फ़र्स्टफ़ में पहले पैरामीटर के रूप में उपयोग किया जाता है, तो इसका काम तब प्रिंटफ के बराबर माना जाता है।
printf(...)
के बराबर है fprintf(stdout,...)
।
fprintf
धारा के उत्पादन के लिए प्रयोग किया जाता है।
sprintf(buffer,...)
एक स्ट्रिंग को एक बफर में प्रारूपित करने के लिए उपयोग किया जाता है।
नोट वहाँ भी है vsprintf
, vfprintf
औरvprintf
v
जायके अमानक मुझे विश्वास कर रहे हैं
v
जायके सी मानक में बहुत निश्चित रूप से कर रहे हैं।
आप 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)
vsnprintf
एक गैर-मानक फ़ंक्शन के बारे में पता होना चाहिए । अधिकांश क्रियान्वयन मैंने इसे या इसके जैसे कुछ को लागू करते हुए देखा है, लेकिन यह कार्यान्वयन-विशिष्ट है।
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
स्प्रिंटफ: राइट्स ने स्टैडआउट के बजाय मेमोरी में कैरेक्टर स्ट्रिंग को डेटा फॉर्मेट किया
स्प्रिंट का सिंटैक्स है:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
यहाँ,
स्ट्रिंग सूचक को मेमोरी में एक बफर को संदर्भित करता है जहां डेटा लिखा जाना है।
फ़ॉर्मेट पॉइंटर को संदर्भित करता है प्रारूप को परिभाषित करने वाले चरित्र स्ट्रिंग को।
प्रत्येक आइटम एक चर या अभिव्यक्ति है जो डेटा को लिखने के लिए निर्दिष्ट करता है।
स्प्रिंटफ द्वारा लौटाया गया मान शून्य से अधिक या उसके बराबर होता है यदि ऑपरेशन सफल होता है या दूसरे शब्दों में लिखे गए वर्णों की संख्या, समाप्त करने वाले शून्य वर्ण की गणना नहीं की जाती है और यदि कोई त्रुटि हुई है तो शून्य से कम मान लौटाता है।
प्रिंटफ: प्रिंट्स टू स्टडआउट
Printf के लिए सिंटैक्स है:
printf format [argument]…
स्प्रिंटफ () और प्रिंटफ () के बीच एकमात्र अंतर यह है कि स्प्रिंटफ () एक चरित्र सरणी में डेटा लिखते हैं, जबकि प्रिंटफ () मानक आउटपुट डिवाइस को स्टडआउट करने के लिए डेटा लिखते हैं।