C# Konsolenausgabe in Textdatei speichern

Ageoffall

Cadet 4th Year
Registriert
Apr. 2011
Beiträge
79
Hallo,

ich schaffe es nicht meine Konsolenausgabe in folgendem Programm in eine Textdatei zu schreiben
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int eingabe;
            int port;
            

            Console.WriteLine("Bitte gewünschte Funktion auswählen");
                Console.WriteLine("1.VLAN Tagged");
                Console.WriteLine("2.VLAN Untagged");
            eingabe = Convert.ToInt32(Console.ReadLine());

            if (eingabe == 1)
            {
                Console.WriteLine("Bitte Port angeben");
                port = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine("VLAN 1");
                Console.WriteLine("tagged " + port);
             
                {
                    for (int i = 8; i <= 46; i++)
                    {
                        Console.WriteLine("VLAN " + i);
                        Console.WriteLine("tagged " + port);

                    }
                }

Die Hilfeseiten von Microsoft haben mir nicht geholfen. Wisst ihr wie ich es schaffe?

Danke für eure Antworten

Cheers
 
Wie kommst du auf den Gedanken es gibt ein Befehl um die Konsolenausgabe direkt in eine Textdatei zu speichern?

Was du suchst ist z.B. der StreamWriter (http://www.csharp-station.com/HowTo/ReadWriteTextFile.aspx).

TextWriter tw = new StreamWriter("date.txt");
// write a line of text to the file
tw.WriteLine(DateTime.Now);
// close the stream
tw.Close();

Das findet man sofort über eine Google Suche über "C# Text Datei erstellen" heraus. Sobald man weiß, mit welcher Klasse man arbeitet, hilft ein dann die MSDN sehr viel, wenn man Detailfragen zu dieser hat.
 
Hatte ich versucht, allerdings hatte er kein Wort in die Textdatei geschrieben
 
Erstmal, kopier dir den Quellcode hier raus, den hab ich von dieser Seite:
Klick



Code:
using System;
using System.IO;
 
class TextDatei
{
 ///<summary>
 /// Liefert den Inhalt der Datei zurück.
 ///</summary>
 ///<param name="sFilename">Dateipfad</param>
 public string ReadFile(String sFilename)
 {
  string sContent = "";
 
  if (File.Exists(sFilename))
  {
   StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);
   sContent = myFile.ReadToEnd();
   myFile.Close();
  }
  return sContent;
 }
 
 ///<summary>
 /// Schreibt den übergebenen Inhalt in eine Textdatei.
 ///</summary>
 ///<param name="sFilename">Pfad zur Datei</param>
 ///<param name="sLines">zu schreibender Text</param>
 public void WriteFile(String sFilename,String sLines)
 {
  StreamWriter myFile = new StreamWriter(sFilename);
  myFile.Write(sLines);
  myFile.Close();
 }
 
 ///<summary>
 /// Fügt den übergebenen Text an das Ende einer Textdatei an.
 ///</summary>
 ///<param name="sFilename">Pfad zur Datei</param>
 ///<param name="sLines">anzufügender Text</param>
 public void Append(string sFilename, string sLines)
 {
  StreamWriter myFile = new StreamWriter(sFilename,true);
  myFile.Write(sLines);
  myFile.Close();
 }
 
 ///<summary>
 /// Liefert den Inhalt der übergebenen Zeilennummer zurück.
 ///</summary>
 ///<param name="sFilename">Pfad zur Datei</param>
 ///<param name="iLine">Zeilennummer</param>
 public string ReadLine(String sFilename, int iLine)
 {
  string sContent = "";
  float fRow=0;
  if (File.Exists(sFilename))
  {
   StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);
   while (! myFile.EndOfStream && fRow < iLine)
   {
    fRow++;
    sContent = myFile.ReadLine(); 
      }
   myFile.Close();
   if(fRow < iLine) 
    sContent = "";
  }
  return sContent;
 }
 
 /// <summary>
 /// Schreibt den übergebenen Text in eine definierte Zeile.
 ///</summary>
 ///<param name="sFilename">Pfad zur Datei</param>
 ///<param name="iLine">Zeilennummer</param>
 ///<param name="sLines">Text für die übergebene Zeile</param>
 ///<param name="bReplace">Text in dieser Zeile überschreiben (t) oder einfügen (f)</param>
 public void WriteLine(String sFilename, int iLine, string sLines, bool bReplace)
 {
  string sContent = "";
  string[] delimiterstring = { "\r\n" };
 
  if (File.Exists(sFilename))
  {
   StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);
   sContent = myFile.ReadToEnd();
   myFile.Close();
  }
 
  string[] sCols = sContent.Split(delimiterstring, StringSplitOptions.None);
 
  if (sCols.Length >= iLine)
  {
   if (!bReplace)
    sCols[iLine - 1] = sLines + "\r\n" + sCols[iLine - 1];
   else
    sCols[iLine - 1] = sLines;
 
   sContent = "";
   for (int x = 0; x < sCols.Length-1; x++)
   {
    sContent += sCols[x] + "\r\n";
   }
   sContent += sCols[sCols.Length-1];
 
  }
  else
  {
   for (int x = 0; x < iLine - sCols.Length; x++)
    sContent += "\r\n";
 
   sContent += sLines;
  }
 
 
  StreamWriter mySaveFile = new StreamWriter(sFilename);
  mySaveFile.Write(sContent);
  mySaveFile.Close();
 }
}


Die Klasse ist bei jedem C#projekt mit von der Partie bei mir, weil immer in TExdateien reingeschrieben wird, und die kLasse einfach Reibungslos läuft und einfach ist.

Das mit der Konsole auslesen würde ich lassen, schreib lieber das was du ausgeben willst vorher in einen String und Speicher ihn/geb ihn aus.

Gruß!
 
Ich würde nicht direkt Console.WriteLine verwenden, sondern deine Ausgabe an eine Funktion übergeben, die per Parameter steuern lässt, wo der Text landet, also etwa

1=Console
2=Ausgabedatei
3=beides

und die Aufrufe dann dahin umstellen, also beispielsweise

Ausgabe("Bitte Port angeben",3);


Die Funktion Ausgabe musst du dann schreiben und dort die Möglichkeiten berücksichtigen
 
@ Ageoffall
Wo legst du die Datei denn an? Schon ein Pfad ala "C:\Temp\Datei.txt" probiert (C:\Temp natürlich anlegen)? Womöglich hat er keine Datei angelegt, weil er keine Schreibrechte hatte (weiß nicht ob das zu einer Exception führt)? Hat er die Datei denn angelegt?
 
Ich hatte den Pfad zum Desktop angelegt. Er erstellte auch eine Datei, doch diese blieb leer.
 
Man kann auch auf der Konsole direkt die Ausgaben eines Programmes in eine Textdatei umleiten:

programmname > programmausgabe.txt
 
manchmal hat er das was er scheieben soll noch im Speicher, was du über den Flusch befehl losen kannst
TextWriter tw = new StreamWriter("date.txt");
// write a line of text to the file
tw.WriteLine(DateTime.Now);
tw.flush();
// close the stream
tw.Close();
 
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int eingabe;
            int port;
            TextWriter tw = new StreamWriter("C:\\Users/jpo/Desktop/Test.txt");

            Console.WriteLine("Bitte gewünschte Funktion auswählen");
                Console.WriteLine("1.VLAN Tagged");
                Console.WriteLine("2.VLAN Untagged");
            eingabe = Convert.ToInt32(Console.ReadLine());

            if (eingabe == 1)
            {
                Console.WriteLine("Bitte Port angeben");
                port = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine("VLAN 1");
                Console.WriteLine("tagged " + port);
                tw.WriteLine(Console.ReadLine());
                tw.Close();
                {
                    for (int i = 8; i <= 46; i++)
                    {
                        Console.WriteLine("VLAN " + i);
                        Console.WriteLine("tagged " + port);
 
Das tw.Close() gehört außerhalb des if-Zweig, da du ihn sonst manchmal nicht schließt. Vor dem Close würde ich ebenfalls mal ein tw.Flush() probieren.
 
Selbes Problem wieder : Er erstellt zwar die Datei "Test.txt" schreibt aber nichts hinein.
Könnte das an dem Console.ReadLine() liegen?
 
Ehrlich gesagt hab ich mir gar nicht angeschaut was bei tw.WriteLine() drinne steht ^^. Wenn ich so darüber nachdenke verwendest du Console.ReadLine() aber komplett falsch. Mit Console.ReadLine() liest du die Tastatureingabe die folgt d.h. das ist etwas ganz was anderes als was du hier machen willst.

Willst du was ausschreiben, musst du den Text für tw.WriteLine("Mein Text") schon ordentlich übergeben.
 
Ich bin ein riesen Trottel :D

Danke euch allen für eure Hilfe (:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int eingabe;
            int port;
            TextWriter tw = new StreamWriter("C:\\Users/jpo/Desktop/Test.txt");

            Console.WriteLine("Bitte gewünschte Funktion auswählen");
                Console.WriteLine("1.VLAN Tagged");
                Console.WriteLine("2.VLAN Untagged");
            eingabe = Convert.ToInt32(Console.ReadLine());

            if (eingabe == 1)
            {
                Console.WriteLine("Bitte Port angeben");
                port = Convert.ToInt32(Console.ReadLine());

                tw.WriteLine("VLAN 1");
                tw.WriteLine("tagged " + port);
                
                {
                    for (int i = 8; i <= 46; i++)
                    {
                        tw.WriteLine("VLAN " + i);
                        tw.WriteLine("tagged " + port);

                     
                    


                    }
                }
                tw.WriteLine("VLAN 99");
                tw.WriteLine("tagged " + port);
                tw.Close();
 
Zuletzt bearbeitet:
Wofür hast du da Klammern außerhalb der For-Schleife? Das tw.Close() kommt raus aus dem if (eingabe ==1), da die Initialisierung ebenfalls außerhalb liegt.

Deine Pfadangabe mag so funktionieren, ist aber nicht Windows Standard. Würde ich entsprechend anpassen. Du kannst übrigens mit einem @ sämtliche Sonderzeichen in einem String ausklammern anstatt jeweils ein \ setzen zu müssen.
 
Ich habe mir die komplette if Abfrage gespart. Da ich im Nachhinein erfahren hab das ich den 2. Punkt nicht brauche.
 
Zurück
Oben