मैं सी में stderr कैसे प्रिंट कर सकता हूं?


119

C में, stdout में प्रिंट करना आसान है, साथ printfमें stdio.h

हालांकि, स्टादर को कैसे प्रिंट किया जा सकता है? हम fprintfइसे स्पष्ट रूप से प्राप्त करने के लिए उपयोग कर सकते हैं , लेकिन इसका सिंटैक्स अजीब लगता है। शायद हम printfstderr को प्रिंट करने के लिए उपयोग कर सकते हैं ?


5
सिंटैक्स के बारे में "अजीब" क्या है? यह प्रिंट है कि कहां , कैसे और क्या
यूजीन श।

5
मैं इस पर ध्यान केंद्रित कर रहा हूं। एकमात्र समस्या जो इस सवाल से उत्पन्न हो रही है, कि आप समाधान "अजीब" पाते हैं। नहीं तो कोई सवाल नहीं है। का उपयोग करें fprintf
यूजीन श।

@Eugene। मैं आपसे सहमत हुँ। मैंने सोचा कि यह अजीब था क्योंकि मुझे एहसास नहीं था कि स्टाइडर एक File :) है
wad

जवाबों:


179

वाक्य-विन्यास लगभग वैसा ही है printf। साथ printfआप दे स्ट्रिंग प्रारूप और उसकी सामग्री अर्थात्:

printf("my %s has %d chars\n", "string format", 30);

साथ fprintfयह एक ही है, आप भी करने के लिए मुद्रित करने के लिए जगह को निर्दिष्ट कर रहे हैं अब सिवाय:

File *myFile;
...
fprintf( myFile, "my %s has %d chars\n", "string format", 30);

या आपके मामले में:

fprintf( stderr, "my %s has %d chars\n", "string format", 30);

34

उदाहरण:

printf("%s", "Hello world\n");              // "Hello world" on stdout (using printf)
fprintf(stdout, "%s", "Hello world\n");     // "Hello world" on stdout (using fprintf)
fprintf(stderr, "%s", "Stack overflow!\n"); // Error message on stderr (using fprintf)

9
#include<stdio.h>

int main ( ) {
    printf( "hello " );
    fprintf( stderr, "HELP!" );
    printf( " world\n" );
    return 0;
}

$ ./a.exe
HELP!hello  world
$ ./a.exe 2> tmp1
hello  world
$ ./a.exe 1> tmp1
HELP!$
  1. stderr आमतौर पर अप्रभावित होता है और आमतौर पर stdout होता है। यह इस तरह के अजीब दिखने वाले आउटपुट को जन्म दे सकता है, जो सुझाव देता है कि कोड गलत क्रम में निष्पादित हो रहा है। यह नहीं है, यह सिर्फ इतना है कि स्टडआउट बफर को अभी तक फ्लश किया जाना है। पुनर्निर्देशित या पाइप की गई धाराएं निश्चित रूप से इस इंटरलेवे को नहीं देखती हैं क्योंकि वे आम तौर पर केवल स्टडआउट या केवल स्टडर के आउटपुट को देखेंगे।

  2. हालांकि शुरू में स्टडआउट और स्टडर दोनों कंसोल में आते हैं, दोनों अलग-अलग होते हैं और व्यक्तिगत रूप से पुनर्निर्देशित किए जा सकते हैं।


5

क्या आप जानते हैं sprintf? यह मूल रूप से एक ही बात है fprintf। पहला तर्क गंतव्य ( fprintfयानी के मामले में फ़ाइल stderr) है, दूसरा तर्क प्रारूप स्ट्रिंग है, और बाकी तर्क हमेशा की तरह तर्क हैं।

मैं इस printf(और परिवार) संदर्भ की भी सिफारिश करता हूं ।


5

यदि आप वर्तमान कोड और केवल डिबग उपयोग के लिए संशोधित नहीं करना चाहते हैं।

इस मैक्रो को जोड़ें:

#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC

बदलें stderrकरने के लिए stdoutयदि आप रोल बैक करना चाहते हैं।

यह डीबग के लिए सहायक है, लेकिन यह एक अच्छा अभ्यास नहीं है।


0

अपना संदर्भ मुद्रित करने के लिए, आप इस तरह कोड लिख सकते हैं:

FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");

यह पिछले उत्तरों में कुछ भी नहीं जोड़ता है और वास्तव में प्रश्न का उत्तर नहीं देता है।
शानदार श्री फॉक्स

वह स्प्रिंटफ () कथन स्मृति भ्रष्टाचार का कारण बनता है! ... मैं आपको अत्यधिक सलाह देता हूं कि आप इस बात पर ध्यान दें कि कैसे संकेत, सरणियां और तार काम करते हैं।
ब्लूशिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.