2012-05-24 9 views
6

यदि हम निम्नलिखित कोड संकलित करते हैं और परिणामी एप्लिकेशन चलाते हैं, तो हम अपना नाम दर्ज करके, एंटर दबाकर और बाहर निकलने के लिए कोई भी कुंजी दबाकर इसके साथ बातचीत करेंगे। इन सभी कार्यों को कंसोल विंडो पर किया जाता है।कंसोल विंडो पर हमारे कार्यों को टेक्स्ट फ़ाइल में कैसे सहेजते हैं?

using System; 

namespace HelloWorld 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.Write("Enter your name: "); 
      var name = Console.ReadLine(); 
      Console.WriteLine("Your name is {0} ", name); 
      Console.ReadKey(); 

     } 
    } 
} 

क्या इन सभी कार्यों को एक टेक्स्ट फ़ाइल में सहेजना संभव है जैसे कि मैं इसे लॉग के रूप में उपयोग कर सकता हूं?

संपादित करें:

मुझे वास्तविक परिदृश्य की व्याख्या करनी चाहिए। मैं सी # के बारे में एक किताब लिख रहा हूँ। मैं कंसोल विंडो के स्क्रीन शॉट को पुस्तक में अटैच करना चाहता हूं क्योंकि मैं अपनी पुस्तक का फ़ाइल आकार जितना संभव हो उतना छोटा बनाना चाहता हूं। इसके बजाय, मैं पुस्तक में कंसोल विंडो की सामग्री दिखाते हुए एक टेक्स्ट फ़ाइल संलग्न करना चाहता हूं। अतिरिक्त कोड जोड़ना (टेक्स्ट फ़ाइल बनाने के लिए) कोड उदाहरण को जटिल करेगा, जो बदले में पाठक को भ्रमित कर देगा।

+0

जादू द्वारा, पसंद है? या एक फ़ाइल खोलें, कार्रवाई लिखें, बंद करें? –

+3

@TiagoPeczenyj मैं जादू दृष्टिकोण के लिए वोट देता हूं! –

+0

@ReedCopsey जादू दृष्टिकोण यह है। यह मुझे लगभग 15 मिनट ले जाएगा। एक लिखने के लिए। – Servy

उत्तर

2

ठीक है, तो विचार यहां कंसोल इनपुट और आउटपुट के लिए पाठक/लेखक को बदलने के लिए है जो उन्होंने पहले किया था, लेकिन लॉग फ़ाइल में भी लिखना था। मैंने एक लॉग क्लास बनाया है जिसे संभवतः विस्तारित किया जाना चाहिए ताकि फाइलनाम/पथ को पैरामीटर के रूप में लिया जा सके, लेकिन यह होना महत्वपूर्ण था कि आउटपुट स्ट्रीम को सिंक्रनाइज़ किया जा सके।

public class Log 
{ 
    private StreamWriter output; 
    public Log() 
    { 
     output = new StreamWriter(File.OpenWrite("output.txt")); 

    } 
    public void Write(char c) 
    { 
     lock (output) 
     { 
      output.Write(c); 
     } 
    } 
    public void Close() 
    { 
     output.Close(); 
    } 
} 

public class MyConsoleOutput : TextWriter 
{ 
    private TextWriter standard; 
    private Log log; 

    public MyConsoleOutput(TextWriter standard, Log log) 
    { 
     this.standard = standard; 
     this.log = log; 
    } 

    public override void Write(char value) 
    { 
     standard.Write(value); 
     log.Write(value); 
    } 

    public override Encoding Encoding 
    { 
     get { return Encoding.Default; } 
    } 

    protected override void Dispose(bool disposing) 
    { 
     standard.Dispose(); 
    } 
} 

public class MyConsoleInput : TextReader 
{ 
    private TextReader standard; 
    private Log log; 
    public MyConsoleInput(TextReader standard, Log log) 
    { 
     this.standard = standard; 
     this.log = log; 
    } 

    public override int Peek() 
    { 
     return standard.Peek(); 
    } 


    public override int Read() 
    { 
     int result = standard.Read(); 
     log.Write((char)result); 
     return result; 
    } 
    protected override void Dispose(bool disposing) 
    { 
     standard.Dispose(); 
    } 
} 

अब जब हम Main के शुरू में इन कक्षाओं में हम निम्नलिखित सही करूँगा बना लिया है:

:

Log log = new Log(); 
Console.SetOut(new MyConsoleOutput(Console.Out, log)); 
Console.SetIn(new MyConsoleInput(Console.In, log)); 

हम भी Main के अंत में इस की आवश्यकता होगी

log.Close(); 

यह कुछ हद तक त्वरित और गंदा लिखना है। यदि आप इसे उत्पादन में उपयोग करते हैं तो आप शायद कक्षा/विधि नामों को बदलना चाहेंगे।

+0

यह सबसे अच्छा जवाब है – gabba

+0

क्या मूल कोड को अव्यवस्थित करने से बचने के लिए 'मुख्य' में पूर्व और पोस्ट कोड छिपाना संभव है? –

+0

इस से मेरे लिए +1 - मुझे नहीं पता कि मैं कभी भी इसका उपयोग करना चाहता हूं, क्योंकि शायद मैं अपने कंसोल आउटपुट से अलग लॉगिंग लिखना पसंद करूंगा, लेकिन यह ओपी के मुद्दों को सुंदर बनाता है सफाई से। –

1

ऐसा कुछ भी नहीं है जो आपके कंसोल आईओ को स्वचालित रूप से "छाया" देगा, इसलिए आपको इसे स्वयं करना होगा। ऐसा कहा जा रहा है कि, एक टेक्स्ट फ़ाइल खोलना और जो भी आप चाहते हैं उसे लिखना काफी आसान है।

अपने मामले में, बस एक टेक्स्ट फ़ाइल खोलें, और जब आप कंसोल पर लिखते हैं और कंसोल से पढ़ते हैं, तो जानकारी को लिखें। विवरण के लिए, एमएसडीएन के How to: Write To a Text File देखें।

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\ProgramOutput.txt", true)) 
     { 
      file.WriteLine(name); 
     } 
+0

"ऐसा कुछ भी नहीं है जो आपके कंसोल आईओ को स्वचालित रूप से 'छाया' देगा" ठीक है, आप मानक इनपुट/आउटपुट स्ट्रीम को बदल सकते हैं ताकि वे जो भी कर रहे हैं, उसके अलावा फाइलों को भी लिख सकें। – Servy

+0

@ सर्वी हाँ - फिर से, स्वचालित नहीं और निर्मित - लेकिन हाँ, आप अपनी खुद की स्ट्रीम क्लास बना सकते हैं जो दोनों ने किया था। इनपुट अजीब होगा, हालांकि, आप आउटपुट में इनपुट जोड़ रहे होंगे ... –

+0

आप सही थे। इनपुट और आउटपुट को एक साथ रखना थोड़ा अजीब था। मैं लॉग क्लास बनाने के लिए इसे अच्छी तरह से काम करने की आवश्यकता समाप्त कर दिया। अगर वे अलग से लिखे गए थे तो मैं दूर जा सकता था। [लिंक] (http://stackoverflow.com/a/10743249/1159478) – Servy

1

आप उत्पादन आप Console के माध्यम से कब्जा करने के लिए क्या एक StreamWriter इस्तेमाल कर सकते हैं

Console.WriteLine("Hello World"); 
FileStream fs = new FileStream("Test.txt", FileMode.Create); 
// First, save the standard output. 
TextWriter tmp = Console.Out; 
StreamWriter sw = new StreamWriter(fs); 
Console.SetOut(sw); 
Console.WriteLine("Hello file"); 
Console.SetOut(tmp); 
Console.WriteLine("Hello World"); 
sw.Close(); 

और पढ़ें पर: http://msdn.microsoft.com/ru-ru/library/system.console.setin.aspx, http://msdn.microsoft.com/ru-ru/library/system.console.setout.aspx, http://msdn.microsoft.com/en-us/library/system.console.in.aspx, http://msdn.microsoft.com/ru-ru/library/system.console.out.aspx

0

इस उदाहरण में सहायक है::

संबंधित मुद्दे