.txt erstellen



  • Hi,
    hab leider nichts passendes im Forum gefunden!
    Falls es doch was gibt bitte sagen

    also wie kann ich in einer Windows Form anwendung eine 3 Variablen einlesen und diese ausgeben
    es gibt textbox1 - textbox3 und die 3 möchte ich in eine txt- speichern
    danke schon mal
    hier mein schon erstellter text (von vs)

    #pragma once
    
    namespace TXTerstellen{
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	/// <summary>
    	/// Summary for Form1
    	///
    	/// WARNING: If you change the name of this class, you will need to change the
    	///          'Resource File Name' property for the managed resource compiler tool
    	///          associated with all .resx files this class depends on.  Otherwise,
    	///          the designers will not be able to interact properly with localized
    	///          resources associated with this form.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Add the constructor code here
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Clean up any resources being used.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Label^  label1;
    	protected: 
    	private: System::Windows::Forms::Label^  label2;
    	private: System::Windows::Forms::Label^  label3;
    	private: System::Windows::Forms::TextBox^  textBox1;
    	private: System::Windows::Forms::TextBox^  textBox2;
    	private: System::Windows::Forms::TextBox^  textBox3;
    	private: System::Windows::Forms::Button^  button1;
    
    	private:
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->label2 = (gcnew System::Windows::Forms::Label());
    			this->label3 = (gcnew System::Windows::Forms::Label());
    			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox2 = (gcnew System::Windows::Forms::TextBox());
    			this->textBox3 = (gcnew System::Windows::Forms::TextBox());
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// label1
    			// 
    			this->label1->AutoSize = true;
    			this->label1->Location = System::Drawing::Point(13, 48);
    			this->label1->Name = L"label1";
    			this->label1->Size = System::Drawing::Size(78, 13);
    			this->label1->TabIndex = 0;
    			this->label1->Text = L"xxx";
    			// 
    			// label2
    			// 
    			this->label2->AutoSize = true;
    			this->label2->Location = System::Drawing::Point(13, 80);
    			this->label2->Name = L"label2";
    			this->label2->Size = System::Drawing::Size(75, 13);
    			this->label2->TabIndex = 1;
    			this->label2->Text = L"xxx";
    			// 
    			// label3
    			// 
    			this->label3->AutoSize = true;
    			this->label3->Location = System::Drawing::Point(12, 114);
    			this->label3->Name = L"label3";
    			this->label3->Size = System::Drawing::Size(50, 13);
    			this->label3->TabIndex = 2;
    			this->label3->Text = L"xxx";
    			// 
    			// textBox1
    			// 
    			this->textBox1->Location = System::Drawing::Point(94, 45);
    			this->textBox1->Name = L"textBox1";
    			this->textBox1->Size = System::Drawing::Size(100, 20);
    			this->textBox1->TabIndex = 3;
    			// 
    			// textBox2
    			// 
    			this->textBox2->Location = System::Drawing::Point(94, 77);
    			this->textBox2->Name = L"textBox2";
    			this->textBox2->Size = System::Drawing::Size(100, 20);
    			this->textBox2->TabIndex = 4;
    			// 
    
    			// textBox3
    			// 
    			this->textBox3->Location = System::Drawing::Point(94, 111);
    			this->textBox3->Name = L"textBox3";
    			this->textBox3->Size = System::Drawing::Size(100, 20);
    			this->textBox3->TabIndex = 5;
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(269, 150);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 6;
    			this->button1->Text = L"Go";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(356, 185);
    			this->Controls->Add(this->button1);
    			this->Controls->Add(this->textBox3);
    			this->Controls->Add(this->textBox2);
    			this->Controls->Add(this->textBox1);
    			this->Controls->Add(this->label3);
    			this->Controls->Add(this->label2);
    			this->Controls->Add(this->label1);
    			this->Name = L"Form1";
    			this->Text = L"xxx";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    // Darein will ichs schreiben und die txt ausgeben
    			 }
    };
    }
    

  • Mod

    Falsche Gruppe! Das ist C++/CLI



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum WinAPI in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • StreamWriter ^sw = gcnew StreamWriter("name-der.txt");
    sw->WriteLine(textBox1->Text);
    sw->WriteLine(textBox2->Text);
    sw->WriteLine(textBox3->Text);
    sw->Close();
    


  • Möchtest du die Textdatei auch wieder in die TextBoxen einlesen?

    Weil wenn die Textboxen nur eine Zeile haben kannst du es einfach so machen

    //Alle zeilen einlesen
    array<String^>^ textdatei = IO::File::ReadAllLines("textdatei.txt");
    //Wenn die Textdatei 3 Zeilen hat
    if(textdatei->Length==3){
      //Einlesen
      textBox1->Text = textdatei[0];
      textBox2->Text = textdatei[1];
      textBox3->Text = textdatei[2];
    }
    //Wenn nicht
    else
    {
      //Fehlernachricht zeigen
      MessageBox::Show("Keine gültige Textdatei","Fehler");
    }
    


  • Beide Codes haben bei mir einen Fehler. Beim ersten:
    Fehler 4 error C2227: left of '->WriteLine' must point to class/struct/union/generic type c:\users\tdk\documents\visual studio 2005\projects\netzwerk ausschalter\netzwerk ausschalter\Form1.h 158
    Fehler 5 error C2227: left of '->WriteLine' must point to class/struct/union/generic type c:\users\tdk\documents\visual studio 2005\projects\netzwerk ausschalter\netzwerk ausschalter\Form1.h 159
    Fehler 6 error C2227: left of '->WriteLine' must point to class/struct/union/generic type c:\users\tdk\documents\visual studio 2005\projects\netzwerk ausschalter\netzwerk ausschalter\Form1.h 160
    Fehler 7 error C2227: left of '->Close' must point to class/struct/union/generic type c:\users\tdk\documents\visual studio 2005\projects\netzwerk ausschalter\netzwerk ausschalter\Form1.h 161
    Fehler 2 error C2065: 'sw' : undeclared identifier c:\users\tdk\documents\visual studio 2005\projects\netzwerk ausschalter\netzwerk ausschalter\Form1.h 157
    Fehler 1 error C2065: 'StreamWriter' : undeclared identifier c:\users\tdk\documents\visual studio 2005\projects\netzwerk ausschalter\netzwerk ausschalter\Form1.h 157
    Fehler 3 error C2061: syntax error : identifier 'StreamWriter' c:\users\tdk\documents\visual studio 2005\projects\netzwerk ausschalter\netzwerk ausschalter\Form1.h 157

    beim zweiten:
    Eine nicht behandelte Ausnahme des Typs "System.IO.FileNotFoundException" ist in mscorlib.dll aufgetreten.

    Zusätzliche Informationen: Die Datei c:\Users\TDK\Documents\Visual Studio 2005\Projects\Netzwerk Ausschalter\Netzwerk Ausschalter\textdatei.txt konnte nicht gefunden werden. - Das aber während dem programm wenn ich auch den button klick das er speichern soll



  • Vermutlich hast Du den namespace "System::IO" nicht eingebunden...
    Also:
    "StreamWriter" durch "System::IO::StreamWriter" erseten...



  • Das war ja der "Öffnen"-Code
    Hier der "Speichern"-Code

    System::IO::File::WriteAllLines("name-der.txt", gcnew array<String^>{textBox1->Text,textBox2->Text,textBox2->Text});
    

    Und hier nochmal "Öffnen" ohne Fehler

    //Ist Datei noch vorhanden?
    if(IO::File::Exists("textdate.txt"))
    {
    //Alle zeilen einlesen
    array<String^>^ textdatei = IO::File::ReadAllLines("textdatei.txt");
    //Wenn die Textdatei 3 Zeilen hat
    if(textdatei->Length==3){
      //Einlesen
      textBox1->Text = textdatei[0];
      textBox2->Text = textdatei[1];
      textBox3->Text = textdatei[2];
    }
    //Wenn nicht
    else
    {
      //Fehlernachricht zeigen
      MessageBox::Show("Keine gültige Textdatei","Fehler");
    }
    }
    else
    {
      //Fehlernachricht zeigen
      MessageBox::Show("Datei nicht gefunden","Fehler");
    
    }
    


  • Warum immer so eine fürchterliche Verschachtelung der Abfragen ?

    //Ist Datei noch vorhanden? 
    if(!IO::File::Exists("textdate.txt")) 
    {
      MessageBox::Show("Datei nicht gefunden","Fehler"); 
      return;
    }
    
    //Alle zeilen einlesen 
    array<String^>^ textdatei = IO::File::ReadAllLines("textdatei.txt"); 
    
    //Wenn die Textdatei != 3 Zeilen hat Fehlernachricht zeigen 
    if(textdatei->Length != 3)
    { 
      MessageBox::Show("Keine gültige Textdatei","Fehler"); 
      return;
    } 
    
    textBox1->Text = textdatei[0]; 
    textBox2->Text = textdatei[1]; 
    textBox3->Text = textdatei[2]; 
    return;
    


  • Oder so

    Machts einen unterschied in der Geschwindikeit wenn man Abfragen verschachtelt oder die Funktion einfach vorher abbricht?

    Ausserdem weiss ich ja nicht in was für einer funktion TDK einlesen möchte
    Denn deine Möglichkeit wäre nur in einer void-Funktion möglich. Bei meiner ist das egal!



  • Denn deine Möglichkeit wäre nur in einer void-Funktion möglich. Bei meiner ist das egal!

    ist kein Argument für die Verschachtelung. Ich denke aber, was wir beide genau wissen, was
    der Satz unsinn ist und aus einem

    return
    

    ein

    return T
    

    auch für
    Anfänger machbar ist.

    Es geht nicht um Geschwindigkeit sondern um Wartbarkeit und Verständlichkeit, vorallem wenn man sich den Code später
    noch mal ansehen will , ändern will etc. (Letztendlich kann es aber jeder machen wie er will.)

    Beispiele:

    if(irgendwas)
    {
    	if(irgendwasanderes)
    	{
    		if(undnochirgendwasnanderesmitlangemunübersichtlichenausdruck)
    		{
    			kleine aktion
    			if(kleine Aktion hat geklappt)
    			{
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    			}
    			else
    			{
    				Aktion fehlgeschlagen
    				return false;
    			}
    		}
    		else
    		{
    			undnochirgendwasnanderesmitlangemun fehlgeschlagen
    			return false;
    		}
    	}
    	else
    	{
    		irgendwasanderes fehlgeschlagen
    		return false;
    	}
    }
    else
    {
    	irgendwas fehlgeschlagen
    	return false;
    }
    
    if(!irgendwas)
    {
    	irgendwas fehlgeschlagen
    	return false;
    }
    
    if(!irgendwasanderes)
    {
    	irgendwasanderes
    	return false;
    }
    
    if(undnochirgendwasnanderesmitlangemunübersichtlichenausdruck)
    {
    	undnochirgendwasnanderesmitlangemunübersichtlichenausdruck fehlgeschlagen
    	return;
    }
    
    kleine aktion
    
    if(kleine Aktion hat geklappt)
    {
    	kleine Aktion fehlgeschlagen
    	return false;
    }
    
    if(irgendwas)
    {
    	if(irgendwasanderes)
    	{
    		if(undnochirgendwasnanderesmitlangemunübersichtlichenausdruck)
    		{
    			kleine aktion
    			if(kleine Aktion hat geklappt)
    			{
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    			}
    			else
    				return false;
    		}
    		else
    			return false;
    	}
    	else
    		return false;
    }
    else
    	return false;
    
    if(! irgendwas)
    	return false;
    
    if(!irgendwasanderes)
    	return false;
    
    if(!undnochirgendwasnanderesmitlangemunübersichtlichenausdruck )
    	return false;
    
    kleine aktion
    
    if(!kleine aktion)
    	return false;
    
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    Ergebnis verwenden
    
    return true;
    

    Natürlich muss man manchmal verschachteln, vorallem wenn man im else Zweig keinen Ausstiegspunkt hat. Man kann es aber
    so gestalten, das man sehr schnell erkennt unter welchen Bedinnungen der eigentliche Code laufen darf.

    private void button1_Click(object sender, EventArgs e)
            {
    		if (sender == null || e == null)
    			return;
    
    		Code
    		Code
    		Code
    		Code
    		Code
    		Code
    		Code
    		Code
    		Code
    		Code
    		Code
            }
    
    private void button1_Click(object sender, EventArgs e)
            {
    		if (sender != null && e != null)
    		{
    			Code
    			Code
    			Code
    			Code
    			Code
    			Code
    			Code
    			Code
    			Code
    			Code
    			Code
    		}
    
    		return;
            }
    

    Ich finde es z.B. Klasse sofort zu sehen wann wo was gemacht wird und nicht erst die Verschachtelung zu zerlegen und Klammern zu zählen. Auch ist es vorteilhaft wenn man den Quellcode auf dem Fenster sieht und man nicht Scrollen muss um die Hauptaktionen des Codes zu sehen (der rechts versteckt liegt).

    Ich finde z.B. viele MS Beispiele grausig weil da das verschachteln vorgemacht wird.



  • Ich stimme dir voll und ganz zu, ich hasse das auch das so weit zu verscharteln.
    Aber das Beispiel vorher ist vielleicht für Anfänger verständlicher, auch wenn du jetzt Iiieh sagen würdest. So lang ist der Code nicht und es gibt auch nur eine Verschachtelung.

    Aber jetzt hat TDK mal zwei Möglichkeiten gesehen und hoffentlich draus gelernt 😉



  • Naja, ist ja am ende nur eine "Geschmackssache" . Ich hab in den letzten 14 Tage nur so viel verschachtelten Code von Kollegen erhalten, das es mich jetzt massiv störte und ich da unbedingt ein Kommentar loswerden musste.



  • Es geht nicht um Geschwindigkeit...

    Das sehe ich aber anders!

    Beispiele:5

    if(irgendwas)
    {
    	if(irgendwasanderes)
    	{
    		if(undnochirgendwasnanderesmitlangemunübersichtlichenausdruck)
    		{
    			kleine aktion
    			if(kleine Aktion hat geklappt)
    			{
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    				Ergebnis verwenden
    			}
    			else
    			{
    				Aktion fehlgeschlagen
    				return false;
    			}
    		}
    		else
    		{
    			undnochirgendwasnanderesmitlangemun fehlgeschlagen
    			return false;
    		}
    	}
    	else
    	{
    		irgendwasanderes fehlgeschlagen
    		return false;
    	}
    }
    else
    {
    	irgendwas fehlgeschlagen
    	return false;
    }
    

    Wenn hier "irgendwas" nicht zutrifft, wird die komplette verschachtelte Abfrage abgebrochen.

    if(!irgendwas)
    {
    	irgendwas fehlgeschlagen
    	return false;
    }
    
    if(!irgendwasanderes)
    {
    	irgendwasanderes
    	return false;
    }
    
    if(undnochirgendwasnanderesmitlangemunübersichtlichenausdruck)
    {
    	undnochirgendwasnanderesmitlangemunübersichtlichenausdruck fehlgeschlagen
    	return;
    }
    
    kleine aktion
    
    if(kleine Aktion hat geklappt)
    {
    	kleine Aktion fehlgeschlagen
    	return false;
    }
    

    Supi, hier werden mehrere if abgefragt.

    Da ist mir persönlich ALLEINE aus Gründen der Geschwindigkeit ersteres lieber! In einem gut dokumentierten Code (sollte eigentlich jeder sein) ist die Verständlichkeit kein wirklich zählendes Argument mehr.

    Ich denke, das ist ein reines Einstellungsproblem (Ich möchte hier niemandem etwas unterstellen!!!), aber in Zeiten, wo CPUs und RAM "nichts" mehr kosten, habe ich den Eindruck, es wird immer weniger Wert auf Performance gelegt.



  • Eine Dokumentation ist kein Ersatz für einen pflegeleichten Quellcode. Da kann noch so gut Dokumentiert sein unter welchen Bedinnungen der Code ausgeführt werden soll, wenn der Code komplex ist, schreit dieser nach Fehlern wenn er nach langer Zeit gewartet werden muss.

    Heute interessiert sich niemand mehr für Performance. Stablilität geht vor. Es bringt Dir nichts, wenn ein Programm schnell ist beim abstürzen. Gut wartbarer Quellcode ist (nebst Dokumentation) nun mal die Grundvoraussetzung für stabilen Code. Dich bezahlt auch keiner eine Anwendung in Assembler zu schreiben, man will das Ergebnis zu einem zahlbaren Preis haben.

    Wenn die Performance irgendwo klemmt sucht man das Problem mit einem Profiler. Die Compiler optimieren soweit, das man nicht abschätzen kann wo man was einsparen kann. Sicherlich muss man überlegen was man macht (das kopieren einer Liste entgegen einer Referenz z.B.) aber die Performance bei einer if Abfrage zu suchen ist IMHO einfach falsch. Wenn man eine so kritische Funktion hat, wird man diese mit dem Profiler schon finden. Die Zeit sollte mit dem Design verbracht werden.

    Btw.: Ein Return beendet die Funktion, ich sehe da nicht warum das mehr Zeit kostet als bei der Verschachtelung.

    http://msdn2.microsoft.com/en-us/library/k68ktdwf(VS.80).aspx

    [edit]
    Letztendlich ist es aber so, das es eine "Einstellungssache" ist bzw. Geschmackssache. Die Praxis wird einem den Weg zeigen, manchmal drückt auch die geschachtelte Abfrage den Zusammenhang deutlicher aus. Hier gibt es keinen "immer richtig" Weg. Aber Performance kostet das zerlegen nicht.
    [edit]



  • Falls ihr nicht wisst wie ihr mit der Arraybeschränkung zurechtkommt:

    array<String^>^ TempRead = System::IO::File::ReadAllLines("Settings.css");
    			int LengthRead = TempRead->Length;
    			switch(LengthRead)
    			{
    			case 2:
    				this->AccountNameBox->Text = TempRead[1];
    				break;
    			case 3:
    				this->AccountNameBox->Text = TempRead[1];
    				this->PasswordBox->Text = TempRead[2];
    				break;
    			case 4:
    				this->AccountNameBox->Text = TempRead[1];
    				this->PasswordBox->Text = TempRead[2];
    				this->PortBox->Text = TempRead[3];
    				break;
    			case 5:
    				this->AccountNameBox->Text = TempRead[1];
    				this->PasswordBox->Text = TempRead[2];
    				this->PortBox->Text = TempRead[3];
    				this->GliderPassWordBox->Text = TempRead[4];
    				break;
    			}
    

    Natürlich kann man den Code auch kürzer schreiben aber ich habe das hier zu Veranschaulichung gemacht. Man kann

    TempRead->Length
    

    auch direkt als Bedingung hinter "switch" stellen, da hier ein Wert zurückgeliefert wird.
    Ich habe hier 2 als erste Bedingung weil ich sozusagen eine Übeschrift in meiner Datei habe die hier nicht gelesen werden soll. Viel Spass noch.



  • Allgemein empfehle ich die Dateinamenerweiterung *.css verwenden,da ein Cascading Style Document einfach professioneller erscheint und nicht so leicht zu durchschauen oder zu editieren. Des weiteren würde ich die Lines codieren. Das ist sehr simpel man muss nur die Übersicht behalten. Zum Beispiel um vertrauliche Informationen sicherer zu gestalten. Des weiteren wünsche ich noch viel Spass bei eurem derzeitigen Projekt.


Anmelden zum Antworten