আমি কীভাবে স্টার্ডারে মুদ্রণ করতে পারি?


119

সি, stdout- এ মুদ্রণ সঙ্গে, সহজ printfথেকে stdio.h

যাইহোক, কিভাবে stderr মুদ্রণ করতে পারেন? আমরা fprintfএটিকে আপাতভাবে অর্জন করতে ব্যবহার করতে পারি, তবে এর বাক্য গঠনটি অদ্ভুত বলে মনে হচ্ছে। সম্ভবত আমরা printfstderr মুদ্রণ ব্যবহার করতে পারেন ?


5
এর সিনট্যাক্স সম্পর্কে এত "অদ্ভুত" কী? এটা তোলে প্রিন্ট এর যেখানে , কিভাবে এবং কি
ইউজিন শ।

5
আমি এটিতে ফোকাস করছি। প্রশ্নটি থেকে উদ্ভূত একমাত্র সমস্যা, আপনি সমাধানটি "অদ্ভুত" সন্ধান করেন। অন্যথায় কোন প্রশ্ন নেই। ব্যবহার fprintf
ইউজিন শ।

@Eugene। আমি আপনার সাথে একমত. আমি ভেবেছিলাম এটি আশ্চর্যজনক যেহেতু আমি বুঝতে পারি নি স্ট্যাডার একটি ফাইল :)
ওয়াড

উত্তর:


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 সাধারণত unfuffered এবং stdout সাধারণত হয়। এটি এর মতো অদ্ভুত দেখাচ্ছে আউটপুট নিয়ে যেতে পারে, যা সূচিত করে যে কোডটি ভুল ক্রমে কার্যকর করা হচ্ছে। এটি নয়, স্ট্যাডআউট বাফারটি এখনও ফ্লাশ করা বাকি। পুনঃনির্দেশিত বা পাইপযুক্ত স্ট্রিম অবশ্যই এই ইন্টারলিভটি দেখতে পাবে না কারণ তারা সাধারণত কেবলমাত্র স্টডআউট বা কেবল স্টার্ডারের আউটপুট দেখতে পাবে।

  2. যদিও প্রাথমিকভাবে stdout এবং stderr উভয়ই কনসোলে আসে, উভয়ই পৃথক এবং পৃথকভাবে পুনঃনির্দেশ করা যায়।


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");

এটি পূর্ববর্তী উত্তরের সাথে কিছু যুক্ত করে না এবং সত্যই প্রশ্নের উত্তর দেয় না।
কল্পনাপ্রসূত মিঃ ফক্স

যে স্প্রিন্টফ () বিবৃতি স্মৃতি দুর্নীতির কারণ! ... আমি আপনাকে পয়েন্টার, অ্যারে এবং স্ট্রিংগুলি কীভাবে কাজ করে তা পড়তে উচ্চ পরামর্শ দিচ্ছি।
ব্লুশিপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.