Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Windows Form Applikation

Empfohlene Antworten

Veröffentlicht

private: System::Void button1_Click_1(System::Object *  sender, System::EventArgs *  e)

		 {


//System::IO::StreamReader  *in;

string line;

string input;

ifstream in;

std::map<string,int> StrMap;



	this->label2->Text="Option 1: Select one file";

	//OpenFileDialog1->ShowDialog();

	 if(OpenFileDialog1->ShowDialog() == DialogResult::OK)

	{

	      //in = new System::IO::StreamReader(OpenFileDialog1->FileName);

	      std::string input = OpenFileDialog1.FileName.ToString();

	      std::ifstream in(input.c_str(), ios::in);

                    //std::ifstream in((OpenFileDialog1->OpenFile()), ios::in);

                    //MessageBox::Show(sr->ReadToEnd());

                   //textBox1->Text = openFileDialog1->FileName; 

                   //textBox1->Text = in->ReadToEnd(); 



	       //	in->Close();



	}

Hat jmd. eine Idee wo der Fehler liegt?

Fehlermeldung:

error C2228: left of '.FileName' must have class/struct/union type

type is 'System::Windows::Forms::OpenFileDialog __gc *'

did you intend to use '->' instead?

Bearbeitet von Klotzkopp

Code Tags vergessen!

Sorry.

OpenFileDialog1->FileName

Ich habe deinen Thread ins .NET-Forum verschoben, weil das kein C++ ist, sondern C++/CLI. Das ist trotz des ähnlichen Namens eine andere Sprache.

Und ein ernst gemeinter Rat: Wenn du GUI mit Windows Forms machen willst, nimm besser C#.

Siehe auch: Jochen Kalmbach

Code Tags vergessen!

Sorry.

Statt dich zu entschuldigen, kannst du sie auch einfach noch einfügen. Du kannst deine Beiträge 15 Minuten lang editieren.

Bearbeitet von Klotzkopp

okay.

inwieweit könnt ihr mich nun bei der fehlerbehebung unterstützen?

habt ihr ideen wieso der fehler auftritt?

Okay allerdings taucht eine erneute Fehlermeldung auf, wenn ich die Zeile wie oben beschrieben verändere.

Fehlermeldung:


c:\Program Files\Microsoft Visual Studio .NET 2003\Visual Studio Projects\wfa_test\Form1.h(279) : error C2440: 'initializing' : cannot convert from 'System::String __gc *' to 'std::basic_string<_Elem,_Traits,_Ax>'

        with

        [

            _Elem=char,

            _Traits=std::char_traits<char>,

            _Ax=std::allocator<char>

        ]

        No constructor could take the source type, or constructor overload resolution was ambiguous

http://support.microsoft.com/kb/311259

Du mischst die Klassen der C++-Standardbibliothek mit den .NET-Klassen. Die können nicht miteinander.

Mach dir klar, was der Unterschied zwischen System::String und std::string ist.

Nochmal mein Rat: Benutz C#, oder benutz zumindest konsequent die .NET-Klassen. Mit diesem Mischmasch begibst du dich auf einen sehr steinigen Pfad.

Bearbeitet von Klotzkopp

irgendwie funktioniert das nicht...

wie hieße denn die syntax korrekterweise?verzweifel schon wieder...:/

irgendwie funktioniert das nicht...
Das ist keine ausreichende Fehlerbeschreibung. Zeig deinen Code und die Fehlermeldung.

wie hieße denn die syntax korrekterweise?
So, wie sie auf der verlinkten Seite steht.

verzweifel schon wieder...:/
Wer nicht hören will...

Ich schreibe hier mehrfach, dass dein Ansatz, Standard-C++ mit C++.NET und Windows Forms zu mischen, keine gute Idee ist. Du merkst anscheinend selbst, dass das nicht einfach ist. Trotzdem machst du offenbar unbeirrbar damit weiter. Da bleibt mir nur, dir zu wünschen, dass du mit deinen selbstauferlegten Schwierigkeiten glücklich wirst.

Das problem ist, dass ich es nicht beeinflussen kann. Mir wurde WFA vom Lehrpersonal vorgegeben.


private: System::Void button1_Click_1(System::Object *  sender, System::EventArgs *  e)

		 {


//System::IO::StreamReader  *in;

string line;

string input;

ifstream in;

std::map<string,int> StrMap;



			this->label2->Text="Option 1: Select one file";

			//OpenFileDialog1->ShowDialog();

		   if(OpenFileDialog1->ShowDialog() == DialogResult::OK)

			{



System::String * input = OpenFileDialog1->FileName;

const __wchar_t __pin * FileName = PtrToStringChars(input);





				//in = new System::IO::StreamReader(OpenFileDialog1->FileName);

				//System::String *input = OpenFileDialog1->FileName;

				std::ifstream in(input);

//std::ifstream in((OpenFileDialog1->OpenFile()), ios::in);

//textBox1->Text = in->ReadToEnd(); 



						//	in->Close();



			}


Fehlermeldung:

c:\Program Files\Microsoft Visual Studio .NET 2003\Visual Studio Projects\wfa_test\Form1.h(294) : error C2664: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const char *,std::_Iosb<_Dummy>::openmode,int)' : cannot convert parameter 1 from 'System::String __gc *' to 'const char *'

with

[

_Elem=char,

_Traits=std::char_traits<char>,

_Dummy=int

]

Cannot convert a managed type to an unmanaged type

Das problem ist, dass ich es nicht beeinflussen kann. Mir wurde WFA vom Lehrpersonal vorgegeben.
Wurde dir auch C++.NET vorgegeben?

Falls nicht, benutz C#.

Falls doch: Wurde dir vorgegeben, dass du C++.NET mit Standard-C++ mischen sollst?

Falls nicht, benutzt die .NET-Klassen, nicht std::map, std::string und std::ifstream.

Falls doch: Dann sehen wir weiter.

Mir wurde nicht direkt vorgegeben das ich das mischen soll, habe allerdings nur Visual .NEt zur Verfügung gestellt bekommen. Ich habe den Sourcecode für das Tool bereits fertig, nun aber nur noch diese Woche um eine GUI zu erstellen.

Die GUI soll ich über WFA machen.

habe allerdings nur Visual .NEt zur Verfügung gestellt bekommen.
Welche Version von Visual Studio .NET? 2002 oder 2003?

Ich habe den Sourcecode für das Tool bereits fertig, nun aber nur noch diese Woche um eine GUI zu erstellen.

Die GUI soll ich über WFA machen.

Geht es immer noch um diesen Zeilenzähler-Tool? Das besteht doch zum größten Teil aus Ein- und Ausgabe, die du für ein GUI sowieso umschreiben musst.

Am schnellsten wäre vermutlich, das Tool komplett in C# neu zu schreiben.

2003...

Ich wollte die Eingabe über eine DialogBox realisieren und nach der Verarbeitung das Ergebnis evtl. in eine TextBox und auf jeden Fall auch in eine Datei schreiben.

gibt es vorschläge ohne das komplette umschreiben c#?

dafür fehlt mir wohl ein wenig die zeit...

wie bereits erwähnt, möchte ich in einer dialogbox eine datei angeben, die dann über ifstream eingelesen wird und folglich bearbeitet wird.

danke!

gibt es vorschläge ohne das komplette umschreiben c#?

dafür fehlt mir wohl ein wenig die zeit...

Wie gesagt, ich vermute, neu schreiben geht schneller.

Du brauchst für den ifstream-Konstruktor den Dateinamen in einem char*. PtrToStringChars bringt dir da nicht viel, weil du damit einen wchar_t* bekommst.

Besser ist vermutlich Methode 2 mit Marshal::StringToHGlobalAnsi, da bekommst du gleich den richtigen Typ.

Du musst natürlich dann ifstream auch mit der richtigen Variablen aufrufen. In deinem letzten Beispiel benutzt du immer noch den System::String*.


if(OpenFileDialog1->ShowDialog() == DialogResult::OK)

			{

				//StreamReader * input = new StreamReader(OpenFileDialog1->FileName);

				String * input = OpenFileDialog1->FileName;

				StreamReader* srFromStream = new StreamReader( File::OpenRead( input ) );


				//MessageBox::Show(sr->ReadToEnd());

				//textBox1->Text = srFromStream->ReadToEnd(); 

				 //textBox1->ScrollBars = ScrollBars::Vertical;


				//in2->Close();


				String* line; 


				while ((line = srFromStream->ReadLine())) 

				{


						//Prüfung ob Zeilen den Anforderungen entspricht	

						if(line->Length > 0 && line->StartsWith( "[" ))			

						{

							// b=line->Contains( "[" );

							//Falls Prüfung zutrifft wird die Zeile im ersten Durchlauf in der map angelegt,

							//bei allen weiteren wird der Zähler erhöht


							++StrMap[*line];

						//	textBox1->Text = line;

						}



				} 


			}

Fehlermeldung:

error C2679: binary '[' : no operator found which takes a right-hand operand of type 'System::String' (or there is no acceptable conversion)

Kann mir jmd helfen, bzgl. der map ohne alles komplett umzuschreiben. Denke ich bin da schonmal auf einen guten Weg. Komme aber nun nicht weiter.

Danke

Das ist immer noch dasselbe Problem: System::String nach std::string.

Du hast das Problem bei ifstream (C++-Klasse) umgangen, indem du auf StreamReader (.NET-Klasse) umgestiegen bist. Wenn du bei std::map (C++-Klasse) bleiben willst, wirst du trotzdem nicht drumherum kommen.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.