Data Read Template Class
-
Hi,
ich bin grade ein wenig am herumexperimentieren mit iostream und co, und möchte mir nun eine template class für verschiedene read classen programmieren.
Ist soweit ja kein Problem, allerdings hapert es am letzten Stückchen
Ich erstelle in der template class ein multidimensionales char array, welches ich dann mit den Zeichenketten füttere, die ich aus Dateien auslese.
Allerdings habe ich jetzt das Problem, das eigentlich alle davon erbenden classen eine unterschiedliche Größe des Arrays benötigen, und ich das leider nich so einfach geregelt bekomme. Ich hatte über eine GetFunktion nachgedacht, die einen Zeiger auf ein Char Array zurückgibt, oder eben ein Vector Array, bin aber mit beidem noch nicht sonderlich gut zurecht gekommen
Vll hat jemand ja eine Idee, wie man das geschickt lösen könnte, hier mal die template class:
#ifndef FILE_INPUT_H #define FILE_INPUT_H #include <string> #include <iostream> #define READ_DATA_MAX_LETTER_IN_ROW 256 #define SIZE_OF_DATA sizeof(m_caData) / sizeof(char) / READ_DATA_MAX_LETTER_IN_ROW using namespace std; template <class T> class TFileInput { public: TFileInput(void) { m_sFileDirectory = ""; DeleteFileData(); } // open, store and interpret file bool ReadFile(string sFileName) { FILE *Data; fopen_s(&Data, (m_sFileDirectory + sFileName).c_str(), "rt"); if(!Data) { return false; } unsigned int i = 0; while(!feof(Data) && i < SIZE_OF_DATA) { fgets(m_caData[i], READ_DATA_MAX_LETTER_IN_ROW - 1, Data); i++; } InterpretFile(); DeleteFileData(); return true; } protected: virtual void InterpretFile() { } string m_sFileDirectory; private: void DeleteFileData() { if (char *pFileData = GetFileData()) { for (unsigned int i = 0; i < SIZE_OF_DATA; i++) { for (unsigned int j = 0; j < READ_DATA_MAX_LETTER_IN_ROW; j++) m_caData[i][j] = 0; } } } }; #endif;
-
1.) Wieso #define?
2.) Wieso C-Files?
-
1. was sollte ich stattdessen verwenden?
2. weil ich es so gelernt habe, und keine alternative kenne...
-
Wie wäre es mit:
const unsigned READ_DATA_MAX_LETTER_IN_ROW = 256;C++ hat IO-Streams: http://www.cplusplus.com/reference/iostream/
-
und das bringt welchen vorteil mit sich?
danke für den link

-
Das erhöht erstens einmal die Lesbarkeit deines Codes.
Außerdem hat C++ schon Operatoren-Überladungen für alle Grunddatentypen, für eiene Typen kann man den Operator auch einfach selbst überladen.
-
Zudem sind sie typsicher.
-
Wenn man allerdings mit Binärdateien arbeitet, kann man sich die fstreams dahin schieben, wo nie die Sonne scheint.

-
anti-freak schrieb:
und das bringt welchen vorteil mit sich?
Man vergisst nicht das fclose, wie du in deinem Code

-
Ethon schrieb:
Wenn man allerdings mit Binärdateien arbeitet, kann man sich die fstreams dahin schieben, wo nie die Sonne scheint.

Wieso denn das? fstreams können auch mit Binärdaten umgehen, wenn du es wirklich benötigst.
-
314159265358979 schrieb:
Wie wäre es mit:
const unsigned READ_DATA_MAX_LETTER_IN_ROW = 256;Aber hoffentlich nicht global.
anti-freak schrieb:
hier mal die template class:
Class Template, um genau zu sein.
#define SIZE_OF_DATA sizeof(m_caData) / sizeof(char) / READ_DATA_MAX_LETTER_IN_ROWsizeof(char)ist immer 1.TFileInput(void) { m_sFileDirectory = "";Unnötig.
DeleteFileData();In nem Konstruktor??
void DeleteFileData() { if (char *pFileData = GetFileData())Weshalb die Zuweisung? Die Variable benutzt du später nicht mehr.
-
Michael E. schrieb:
314159265358979 schrieb:
Wie wäre es mit:
const unsigned READ_DATA_MAX_LETTER_IN_ROW = 256;Aber hoffentlich nicht global.
Warum nicht global? Für Konstanten ist das doch völlig ok.
-
Was hat denn der Rest des Programms mit einer IO-Konstante zu tun?
-
Michael E. schrieb:
Was hat denn der Rest des Programms mit einer IO-Konstante zu tun?
Genausoviel wie mit der Implementierung der ganzen FileInput-Geschichte. Nämlich nichts.
Der Fehler ist aber nicht, dass die Konstante global definiert wird, sondern dass der ganze Schmu inline im Header implementiert wird.