Txt reihenweise auslesen mit Winapi Funktionen
-
Warum- und wie verhindert man das?? Klär mich mal auf, ich will nämlich demnächst auch was ähnliches versuchen.
-
@Codefinder Könntest du ein Beispiel schreiben und mir sagen ob es bestimmte Includes gibt??
-
dontfeedphil schrieb:
@Codefinder Könntest du ein Beispiel schreiben und mir sagen ob es bestimmte Includes gibt??
Zu std::string's ?, jo kein problem...:
#include <Windows.h> #include <ioStream> #include <String> using namespace std; int main() { string strText = "Ich bin ein Text!"; cout << strText << endl; // Stream-Output MessageBox(NULL, strText.c_str(), NULL, 0); // MessageBox-WinAPI return (0); }
-
Also so war das nicht gemeint ich habe eine Winapi Anwendung....^^...und keine "normale" C++....und dann geht das nicht mit using namespace std;....
-
Elektronix schrieb:
Warum- und wie verhindert man das?? Klär mich mal auf, ich will nämlich demnächst auch was ähnliches versuchen.
Du hast verschiedene Möglichkeiten:
1. Möglichkeit:
struct SInput { TCHAR szWord[GANZZAHL]; TCHAR szTrslt[GANZZAHL]; };szWord und szTrslt können hier genau GANZZAHL - 1 Zeichen aufnehmen. Wenn du mehr reinschreibst
gibt es einen Pufferüberlauf
. Das ist statisch reservierter Speicher.
Beispiel zur Initialisierung:const int MAX_STRLENGTH = 500; // maximale Anzahl struct SInput { TCHAR szWord[MAX_STRLENGTH]; TCHAR szTrslt[MAX_STRLENGTH]; }; SInput sInputObj; StrNCpy(sInputObj.szWord, TEXT("Hallo ich bin ein String und werde kopiert."), MAX_STRLENGTH);2. Möglichkeit:
struct SInput { PTCHAR pszWord; PTCHAR pszTrslt; };pszWord und pszTrslt müssen hier vorher reserviert werden. Dazu verwendet man bspw. den Operator new.
Zum freigeben muss du dann entsprechend delete benutzen. Damit kannst du dann so lange Texte speichern
wie du willst -selbstverständlich immer abhängig von der Reservierung (und vom Speicher
). Das
nennt man dynamische Speicherreserierung.
Hier ein Beispiel wie man das Element 'pszWord' korrekt initialisiert:// -------------------------------------- // hWnd sei ein gültiger Fensterhandle... // -------------------------------------- // Beschreibung: // Hier wird der Fenstertext des Fensters hWnd in pszWord // gespeichert (1. Speicherreserivierung 2. Initialisierung) // und anschließend via MessageBox ausgegeben. // Danach wird der Speicherbereich deallokiert. // -------------------------------------- UINT uiStrLen; SInput sInputObj; ZeroMemory(&sInputObj, sizeof(SInput)); uiStrLen = GetWindowTextLength(hWnd) + 1; sInputObj.pszWord = new TCHAR[uiStrLen]; // Speicher reserivieren GetWindowText(hWnd, sInputObj.pszWord, uiStrLen); MessageBox(NULL, sInputObj.pszWord, NULL, 0); delete [] sInputObj.pszWord; // Speicher deallokieren sInputObj.pszWord = NULL; // '= NULL' zur Kennzeichnung eines nicht-reservierten/ungültigen Zeigers/Speicherbereichs // --------------------------------------3. Möglichkeit:
struct SInput { std::string strWord; std::string strTrlt; };Hier kannst du strWord und strTrlt zuweisen, was du willst...die Reservierung übernehmen die Objekte
selbst. Denn std::string ist eine Klasse und somit strWord ein Objekt davon
.
Beispiel zur Initialisierung:#include <String> // ... std::string strExample = "Das funktioniert auch perfekt! - Wunderbar :-)"; // ...EDIT: Verfeinert...
Beispiele eingefügt
.
-
dontfeedphil schrieb:
Also so war das nicht gemeint ich habe eine Winapi Anwendung....^^...und keine "normale" C++....und dann geht das nicht mit using namespace std;....
'using namespace' führt nur eine Namensbereich-Importierung durch. Das funktioniert selbstverständlich auch in WinAPI Programmen.

-
Ok dann habe ich noch ne Frage...Also ich arbeite mit dem MinGW Delevoper Studio und wenn ich in meiner Winapi Anwendung jetzt die C++ Funktionen: ifstream,getline multimap usw...benutze dann erkennt er diese nicht obwohl ich die entsprechenden Libraries includet habe...das wär mir ganz wichtig...z.B. für :
ifstream data("text.txt");habe ich folgende Libraries includet :
#include <windows.h> #include <stdio.h> #include <iostream> #include <string> #include <fstream> #include <cstdlib>und es funkt immernoch nicht...oder kommt es vielleicht draufan wo ich den C++ in der Winapi Anwendung schreibe??

-
dontfeedphil schrieb:
ifstream data("text.txt");habe ich folgende Libraries includet :
#include <windows.h> #include <stdio.h> #include <iostream> #include <string> #include <fstream> #include <cstdlib>und es funkt immernoch nicht...oder kommt es vielleicht draufan wo ich den C++ in der Winapi Anwendung schreibe??

1. Das sind Header, keine Libraries !
2.
dontfeedphil schrieb:
oder kommt es vielleicht draufan wo ich den C++ in der Winapi Anwendung schreibe??

Huh?!, bitte was ? C++ ist eine Programmiersprache, WinAPI eine 'Funktionssammlung' ...

3.

#include <windows.h> #include <stdio.h> #include <iostream> #include <string> #include <fstream> #include <cstdlib> using namespace std; // vllt. vergessen ?!^^ // ...4. Zeig mal die Error-Log deines Compilers
.
-
--------------------Configuration: VocabsRenew - Debug-------------------- Compiling source file(s)... VocabsRenew.cpp VocabsRenew.cpp: In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)': VocabsRenew.cpp:104: error: jump to case label VocabsRenew.cpp:93: error: crosses initialization of `std::ifstream data' VocabsRenew.cpp:121: error: jump to case label VocabsRenew.cpp:93: error: crosses initialization of `std::ifstream data' VocabsRenew.cpp:104: warning: destructor needed for `data' VocabsRenew.cpp:104: warning: where case label appears here VocabsRenew.cpp:104: warning: (enclose actions of previous case statements requiring destructors in their own scope.) VocabsRenew.cpp:121: warning: destructor needed for `data' VocabsRenew.cpp:121: warning: where case label appears here VocabsRenew.cpp:128:2: warning: no newline at end of file
-
Zeig mir auch mal den entsprechenden Quellcode...
BTW:
Entweder:switch(Wert) { case 1: { int i = 0; /* ... */ } break; case 2: ... }oder:
switch(Wert) { case 1: { int i; i = 0; /* ... */ } break; case 2: ... }oder so:
int i; switch(Wert) { case 1: { i = 0; /* ... */ } break; case 2: ... }PS: Das sind Grundlagen...vllt solltest du mit einem C/C++ Tutorial anfangen.
-
Also sorry aber ich glaube du verstehst mich vollkommen falsch...Ich schreibe kein Konsolenprogramm....Und wenn ich mich irre dann entschuldige ich mich bei dir...^^
-
dontfeedphil schrieb:
Also sorry aber ich glaube du verstehst mich vollkommen falsch...Ich schreibe kein Konsolenprogramm....Und wenn ich mich irre dann entschuldige ich mich bei dir...^^
loly,...Ich glaube du verstehst mich falsch...
Wenn man ein WinAPI Programm schreibt (das tust du ja^^) dann bruach man fundiertes Wissen in C und/oder C++.
Denn WinAPI basiert auf der Programmiersprache C. Die solltest du dann auch annähernd beherschen, sonst hat es
keinen Sinn
.
-
Ahaaa! Danke für die ausführliche Antwort, das war sehr aufschlußreich!

-
@Elektronix: Jo Kein Problem
!@dontfeedphil: Kannst mir deinen Code aber schon noch zeigen...vllt kann ich dir ja helfen
.
-
Soll wenn Button geklickt wird Inhalt von Editfeld mit dem aus der Txt Datei vergleichen....
Ich weiß wie man das Editfeld ausliest und das mit dem Button macht ,das hier ist nur ein Test und hier funkt es nicht mal mit der Txt....#include <windows.h> #include <stdio.h> #include <iostream> #include <string> #include <fstream> #include <cstdlib> #define ID_EDIT 1 using namespace std; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Klassenname"); HWND hwnd; MSG msg; WNDCLASSEX wndclassex = {0}; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = hInstance; wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW); wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = szAppName; wndclassex.hIconSm = wndclassex.hIcon; if (!RegisterClassEx (&wndclassex)) { MessageBox (NULL, TEXT ("RegisterClassEx fehlgeschlagen!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, szAppName, TEXT ("Hallo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, Fensters CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HWND hEdit1; static HWND hButtonAN; char szBuffer[100]; TCHAR *Text1 = NULL; TCHAR *Text2 = NULL; TCHAR *Text3 = NULL; switch (message) { int iIndex; case WM_CREATE: //EDITFELDER hEdit1 = CreateWindow(TEXT ("edit"),Text1,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,150,100,200,25,hwnd,(HMENU)ID_EDIT,((LPCREATESTRUCT)lParam) ->hInstance,NULL); ifstream data("dict.txt"); return (0); case WM_PAINT: hdc = BeginPaint (hwnd, &ps); TextOut (hdc, 210, 50, "Hallo", 50); EndPaint (hwnd, &ps); return (0); case WM_DESTROY: PostQuitMessage (0); return (0); } return DefWindowProc (hwnd, message, wParam, lParam); }
-
Nochmal zu dem Können von C++ ...
Ich will nicht sagen das ich ein Profi bin und man lernt nie aus ^^ aber können tue ich das ich habe das Prog ja schon in C++ geschrieben aber ich möchte jetzt gerne eine grafische Oberfläche dazu schreiben....^^
und sorry das ich dich falsch verstanden habe denn das sah ein bisschen aus wie ein Konsolen-Programm...