Komplizierte Frage zu CStdioFile
-
Hallo Leute,
ich hab mal wieder ein sehr komplizierte Frage und ich weiß nicht wie ich die lösen soll
Vorab erstmal ein Bild damit ihr das auch versteht was ich meine. Es geht um die 3 eingerahmten Felder
Also und zwar soll im Feld "Regler", eine Datei ausgelesen werden wenn ich einen Eintrag auswähle - insgesamt wird es zwei Dateien geben mit ca. 5000-10000 Zeilen.
Diese Datei soll aber nur im Hintergrund geöffnet werdenDie Datei wird ungefähr so aufgebaut sein
c0001 = 1; factor = 1; c0002 = 2; factor = 100;
So und nun kommt das schwierige an dem ganzen, denn sobald ich nun im Feld "Code" eine Zahl von 1-9999 eingebe soll die Datei nach diesem "Code" abgesucht werden.
Sobald dies dann gefunden wurde, soll die Zeile darunten, also "factor", in das Feld "Faktor" geschrieben werden - bzw. in dessen Variable.
Ich hab null ahnung wie ich da anfangen soll, denn zur Zeit wird das noch per Hand eingetragen aber von den 10000 Codestellen hat jede einen anderen Faktor und die kennt keiner auswendig und das handbuch schleppt auch keine mit
(bzw. 2 Handbücher, weil es zwei verschiedene geräte sind)
(mir wäre das ganze egal aber mein chef will das so haben
bzw. der senior
)
mfg
shona
-
Hallo
Wie speicherst du die Daten aus der Datei ab? Wenn du das ganze in einer STL Map speicherst kannst du ja ganz einfach nach dem Code suchen. Und den Faktor dann ausgeben
-
bis jetzt speichere ich die noch gar nicht ab, weil ich erstmal alle in eine datei schrieben muss
wie gesagt ich muss erstaml wissen wie ich das ganze anfange. bräuchte auch erstmal ein beispiel um das ganze zu verstehen. alles was ich bis jetzt nämlich gefunden habe ist für mich bahnhof und das meiste ist für dateien in Unicode
-
bis jetzt speichere ich die noch gar nicht ab, weil ich erstmal alle in eine datei schrieben muss
Wie du musst erstmal in eine Datei schreiben. Du wolltes doch noch gerade lesen. Deine Worte waren doch :
...eine Datei ausgelesen werden wenn ich einen Eintrag auswähle...
wie gesagt ich muss erstaml wissen wie ich das ganze anfange.
Um was geht es denn nun: Datei lesen oder gespeicherte Daten in einer Liste finden oder jetzt doch Datei schreiben.
-
hab doch extra ein bild gemacht das man es versteht
Also wie man auf dem Bild sieht gibt es eine ComboBox die unter dem Namen "Regler" ist. Wenn ich da nun einen Eintrag auswähle soll die dazu gehörige Datei geöffnet werden.
Die datei dazu muss ich aber noch machen (wie gesagt sind aber 5000-10000 zeilen eine menge), diese sind dann aber schon da. ich will also nur lesen nicht schreiben
EDIT: MIt Datei schreiben meinte ich auch das ich diese noch mit dem Editor oder sonst einem Programm anlegen muss
-
Drum habe ich ja gemeint lies deine Datei ein und speichere diese in einer STL Map ab.
Woran scheiterst du noch?
1. Am einlesen einer Datei?
2. Speichern der Daten in eine Map?
3. Suchen der Daten in einer Map?
4. Das setzen der Variablen im Dialog?
-
sasse schrieb:
Drum habe ich ja gemeint lies deine Datei ein und speichere diese in einer STL Map ab.
Woran scheiterst du noch?
1. Am einlesen einer Datei?
2. Speichern der Daten in eine Map?
3. Suchen der Daten in einer Map?
4. Das setzen der Variablen im Dialog?Bei allem
deshalb hab ich ja gefragt
Ich such jetzt seit zwei tagen nach Beispielen für CStdioFile die auch ein normaler Mensch versteht der nicht soviel ahnung hat, aber keine gefunden
wobei das setzten einer variable im dialog kein problem ist, die ist schon vorhanden (für das erste feld heißt die m_sControlFact1)
wie du auch auf dem bild siehst gibt es mehrere felder das mus sich auch noch unterscheiden können
-
zu 1:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-12121.htmlzu 2 und 3:
einfach mal bei google "stl map Beispiel" eingeben. Da gibt es genügend.
-
danke für den CStdioFile-Code
hab aber auch hie gesucht aber das hab ich nicht gefunden^^
ok werde ich mal machen wenn ich wieder hilfe brauche melde ich mich
-
jetzt steh ich doch wieder mal auf der leitung
edit: ist das richtig so?
void CSettingsDlg::OnCbnSelchangeActuator() { switch(m_sActuator.GetCurSel()) { case 0: { CStdioFile WurstFile; // So viel Spass muss sein if (WurstFile.Open("datei.txt", CFile::modeRead)) { CString Zeile; while (WurstFile.ReadString(Zeile)) { m_sRActuator += Zeile; } UpdateData(false); WurstFile.Close(); } else MessageBox("Scheiss Datei kann nich geöffnet werden!", "Fehler", 0); } break; case 1: { CStdioFile WurstFile; // So viel Spass muss sein if (WurstFile.Open("datei1.txt", CFile::modeRead)) { CString Zeile; while (WurstFile.ReadString(Zeile)) { m_sRActuator += Zeile; } UpdateData(false); WurstFile.Close(); } else MessageBox("Scheiss Datei kann nich geöffnet werden!", "Fehler", 0); } break; } }
Hab die Variable "m_sRActuator" als "CString" deklariert, ist das richtig?
-
Hallo
Hast du schon mal was von Coderedundanz gehört. Man sollte den Code nicht für jeden Case Fall implementieren. Die Nachteile muss ich dir glaub ich nicht erklären, oder etwa doch.
CString ist richtig. Sagen wir mal fürs erste. Somit hast du ja nun die ganze Datei in einem String. Wie gesagt um nach bestimmten Werten zu suchen musst du das ganze in einer map speichern.
-
Habe seit über einem Jahr nichts mehr in C++ gemacht und nun soll ich das machen, natürlich weiß ich nicht was "Coderedundanz" ist
wie soll ich es dann machen?
brauche doch den code für 2 verschiedene dateien also einmal zum öffnen von datei.txt und einmal für datei1.txt
-
Habe seit über einem Jahr nichts mehr in C++ gemacht und nun soll ich das machen, natürlich weiß ich nicht was "Coderedundanz" ist
Na du bist lustig. Das hat nicht nur was mit c++ zu tun sondern allgemein mit der Programmierung. Ein paar Grundlagen sollte man aber schon kennen bevor man sich direkt an ein "schwierigeres" Projekt begibt.
wie soll ich es dann machen?
Wie wärs mit einer Funktion:
void CSettingsDlg::OnCbnSelchangeActuator() { switch(m_sActuator.GetCurSel()) { case 0: m_sRActuator = OpenFile("datei.txt"); break; case 1: m_sRActuator = OpenFile("datei1.txt"); break; } } CString CSettingsDlg::OpenFile(const CString &file) { CString sRActuator; CStdioFile WurstFile; // So viel Spass muss sein if (WurstFile.Open(file, CFile::modeRead)) { CString Zeile; while (WurstFile.ReadString(Zeile)) { sRActuator+= Zeile; } UpdateData(false); WurstFile.Close(); } else MessageBox("Scheiss Datei kann nich geöffnet werden!", "Fehler", 0); return sRActuator; }
Nur mal so als Schnellschuss wobei man hier noch einiges verbessern sollte.
-
sasse schrieb:
Na du bist lustig. Das hat nicht nur was mit c++ zu tun sondern allgemein mit der Programmierung. Ein paar Grundlagen sollte man aber schon kennen bevor man sich direkt an ein "schwierigeres" Projekt begibt.
Sagt das meinem Chef
der sagt "learning by doing" und "das findet man doch alles im inet oder in irgendeinem buch ist es beschrieben" -.-
wunderbar aber hauptsache ich soll den scheiß machen
naja egal. danke für deine hilfe aber ich komm damit nicht klar - die funktionen verstehe ich zwar aber ich weiß nicht wie ich sie einsetzen soll.
des weiteren habe ich bis jetzt immer den switch-befehl zusammen mit dem enum-befehl benutzt und das kann ich hier nicht.
ich brauche das aber, weil ich das in 3 weiteren dateien verschateln muss damit es richtig funktioniert.
Außerdem muss ich den swicth-befehl noch in "InitializeControls" aufrufen können, kann ich so aber nicht.
des weiteren fehlt mir für m_sRActuator der Variablentyp
und den habe ich immer selbst benannt wie z. B. "Actuator m_sRActuator" - "Actuator" ist hier die Bezeichnung für mein enum-Befehl - geht hier aber nicht
-
wunderbar aber hauptsache ich soll den scheiß machen
Als was bist du angestellt? Als Gärtner oder als Programmierer?
die funktionen verstehe ich zwar aber ich weiß nicht wie ich sie einsetzen soll.
Habe die Funktion doch mit Aufruf in dem Beispiel. Also was konkret verstehst du da nicht.
des weiteren habe ich bis jetzt immer den switch-befehl zusammen mit dem enum-befehl benutzt und das kann ich hier nicht.
Wieso nicht?
Außerdem muss ich den swicth-befehl noch in "InitializeControls" aufrufen können, kann ich so aber nicht.
Wieso nicht?
des weiteren fehlt mir für m_sRActuator der Variablentyp
Da waren wir doch schon. Ist doch in diesem Beispiel ein CString.
Also ich sags mal hart du hast von der Programmierung kaum eine Ahnung. Du solltest ein Buch lesen, eine Schulung besuchen, studieren, ... . Sonst wird das nichts.
-
Als was bist du angestellt? Als Gärtner oder als Programmierer?
Ha stell dir mal vor wir wären in einem Ärtzeforum:
Also ich habe da so einen Patienten der hat die Grippe. Was soll ich nun machen. Wie zieht man die Spritze auf. Und wieso darf ich die eigentlich nur einmal verwenden. Ich habe halt schon seit einem Jahr nicht mehr praktiziert.
-
OMG ich habe nur gefragt und dann kommt sowas, was machst du dann hier wenn du gar nicht helfen willst?
ich schreibe dir sogar das ich seit über einem jahr nichts gemacht habe und dann soll ich auf anhieb wieder wissen wie das geht, KLAR!
Ich bin übrigens Auszubildene für Geräte und Systeme und keine Programmiererin aber ich soll es halt lernen mit "learning by doing"
-
Ich hoffe du meinst jetzt nicht mit sondern den lustigen Kerl da.
Versuche schon die ganze Zeit dir zu helfen. Du solltest deine Fragen nur etwas konkretisieren. Mit einfach nur geht nicht, kann dir keiner helfen.
"learning by doing" funktioniert vieleicht wenn man zumindest die Grundlagen kennt. Und nach einem Jahr sollte man diese nicht vergessen haben wenn man sie gekannt hat.
-
Ich kenne die kleinen Grundlagen aber das mit switch kannt ich nicht, stand auch in keinem meiner bücher.
nun zum problem:
wenn ich die Variable m_sRActuator als CString verwende habe ich keine Möglichkeit diese als enum einzufügen, bringt mir nur Fehler.
hier ein beispiel (auszug aus meinem programm) wie ich es immer gemacht habe und es funktioniert so ohne problem und ohne fehler
Datei SettingsDlg.cpp
void CSettingsDlg::InitializeControls(void) { switch (m_sCurrPara1) { case CHANNEL1: m_sParaChannel1.SetCurSel(0); break; case CHANNEL2: m_sParaChannel1.SetCurSel(1); break; } } void CSettingsDlg::OnCbnSelchangeParachannel1() { switch (m_sParaChannel1.GetCurSel()) { case 0: m_sCurrPara1 = CHANNEL1; break; case 1: m_sCurrPara1 = CHANNEL2; break; } }
Datei SettingsDlg.h
CComboBox m_sParaChannel1; Parachannel m_sCurrPara1;
Datei DSOZDoc.cpp
m_sCurrPara1 = CHANNEL1; // Default immer anzeigen
Datei DSOZDoc.h
Parachannel m_sCurrPara1;
Datei Light.h
enum Parachannel { CHANNEL1 = 1536, // Kanal 1 CHANNEL2 = 1600, // Kanal 2 };
Somit funktioniert das ohne Probleme und auch die Praxis hat gezeigt das es so geht. Alles hat wunderbar funtkioniert.
Deshalb ist für mich die Frage wie ich ien CString in InitializeControls oder in ein enum - einfügen kann.
Verstehst du nun was mein Problem ist
mfg
shona
-
keiner ne idee wie ich das OpenFile("") in ein enum bekomme, weil dann hätte ich zumindest das mal