KSGTDatei.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #include "KSGTDatei.h"
  2. #include "Datei.h"
  3. #include "Text.h"
  4. using namespace Framework;
  5. // Inhalt der KSGTDatei Klasse aus KSGTDatei.h
  6. // Konstruktor
  7. KSGTDatei::KSGTDatei()
  8. : ReferenceCounter(),
  9. pfad(new Text()),
  10. data(new RCArray<RCArray<Text>>())
  11. {}
  12. KSGTDatei::KSGTDatei(const char* pfad)
  13. : ReferenceCounter(),
  14. pfad(new Text()),
  15. data(new RCArray<RCArray<Text>>())
  16. {
  17. setPfad(pfad);
  18. }
  19. KSGTDatei::KSGTDatei(Text* pfad)
  20. : ReferenceCounter(),
  21. pfad(new Text()),
  22. data(new RCArray<RCArray<Text>>())
  23. {
  24. setPfad(pfad);
  25. }
  26. // Destruktor
  27. KSGTDatei::~KSGTDatei()
  28. {
  29. pfad->release();
  30. data->release();
  31. }
  32. // nicht constant
  33. void KSGTDatei::setPfad(const char* pfad)
  34. {
  35. this->pfad->setText(pfad);
  36. }
  37. void KSGTDatei::setPfad(Text* pfad)
  38. {
  39. this->pfad->setText(*pfad);
  40. pfad->release();
  41. }
  42. bool KSGTDatei::laden()
  43. {
  44. std::ifstream inf;
  45. inf.open(pfad->getText(), std::ios::binary);
  46. if (!inf.good() || !inf.is_open()) return 0;
  47. data->leeren();
  48. inf.seekg(0, std::ios::end);
  49. __int64 gr = inf.tellg();
  50. __int64 pos = 0;
  51. int zeilenPos = 0;
  52. int feldPos = 0;
  53. while (pos < gr)
  54. {
  55. inf.seekg(pos, std::ios::beg);
  56. char c = 1;
  57. int len = 0;
  58. do
  59. {
  60. inf.read(&c, 1);
  61. ++len;
  62. } while (c != 0 && c != '\n' && pos + len < gr);
  63. if (pos + len == gr) ++len;
  64. inf.seekg(pos, std::ios::beg);
  65. char* v = new char[len];
  66. v[len - 1] = 0;
  67. if (len > 1) inf.read(v, len - 1);
  68. pos += len;
  69. if (zeilenPos > data->getLastIndex()) data->add(new RCArray<Text>);
  70. auto line = data->z(zeilenPos);
  71. if (feldPos > line->getLastIndex())
  72. line->add(new Text(v));
  73. else
  74. line->z(feldPos)->setText(v);
  75. delete[] v;
  76. if (c == 0)
  77. ++feldPos;
  78. else if (c == '\n')
  79. {
  80. ++zeilenPos;
  81. feldPos = 0;
  82. }
  83. else
  84. break;
  85. }
  86. inf.close();
  87. return 1;
  88. }
  89. bool KSGTDatei::addZeile(int feldAnzahl, RCArray<Text>* zWert)
  90. {
  91. auto line = new RCArray<Text>();
  92. data->add(line);
  93. for (Text* t : *zWert)
  94. line->add((Text*)t ? new Text(t->getText()) : 0);
  95. return 1;
  96. }
  97. bool KSGTDatei::setZeile(int zeile, int feldAnzahl, RCArray<Text>* zWert)
  98. {
  99. int zA = getZeilenAnzahl();
  100. if (zeile >= zA) return 0;
  101. auto line = new RCArray<Text>();
  102. data->set(line, zeile);
  103. for (Text* t : *zWert)
  104. line->add(t ? new Text(t->getText()) : 0);
  105. return 1;
  106. }
  107. bool KSGTDatei::removeZeile(int zeile)
  108. {
  109. int zA = getZeilenAnzahl();
  110. if (zeile >= zA) return 0;
  111. data->remove(zeile);
  112. return 1;
  113. }
  114. bool KSGTDatei::addFeld(int zeile, int pos, Text* wert)
  115. {
  116. int zA = getZeilenAnzahl();
  117. if (zeile >= zA)
  118. {
  119. wert->release();
  120. return 0;
  121. }
  122. int fA = getFeldAnzahl(zeile);
  123. if (pos > fA)
  124. {
  125. wert->release();
  126. return 0;
  127. }
  128. data->z(zeile)->add(new Text(wert->getText()), pos);
  129. wert->release();
  130. return 1;
  131. }
  132. bool KSGTDatei::addFeld(int zeile, int pos, const char* wert)
  133. {
  134. return addFeld(zeile, pos, new Text(wert));
  135. }
  136. bool KSGTDatei::addFeld(int zeile, Text* wert)
  137. {
  138. int zA = getZeilenAnzahl();
  139. if (zeile >= zA)
  140. {
  141. wert->release();
  142. return 0;
  143. }
  144. data->z(zeile)->add(new Text(wert->getText()));
  145. wert->release();
  146. return 1;
  147. }
  148. bool KSGTDatei::addFeld(int zeile, const char* wert)
  149. {
  150. return addFeld(zeile, new Text(wert));
  151. }
  152. bool KSGTDatei::setFeld(int zeile, int feld, Text* wert)
  153. {
  154. int zA = getZeilenAnzahl();
  155. if (zeile >= zA)
  156. {
  157. wert->release();
  158. return 0;
  159. }
  160. int fA = getFeldAnzahl(zeile);
  161. if (feld >= fA)
  162. {
  163. wert->release();
  164. return 0;
  165. }
  166. data->z(zeile)->set(new Text(wert->getText()), feld);
  167. wert->release();
  168. return 1;
  169. }
  170. bool KSGTDatei::setFeld(int zeile, int feld, const char* wert)
  171. {
  172. return setFeld(zeile, feld, new Text(wert));
  173. }
  174. bool KSGTDatei::removeFeld(int zeile, int feld)
  175. {
  176. int zA = getZeilenAnzahl();
  177. if (zeile >= zA) return 0;
  178. int fA = getFeldAnzahl(zeile);
  179. if (feld >= fA) return 0;
  180. data->z(zeile)->remove(feld);
  181. return 1;
  182. }
  183. bool KSGTDatei::speichern()
  184. {
  185. if (!pfad->getLength()) return 0;
  186. if (!DateiExistiert(pfad->getText())) DateiPfadErstellen(pfad->getText());
  187. std::ofstream of(pfad->getText(), std::ios::binary);
  188. if (!of.good() || !of.is_open()) return 0;
  189. int i = 0;
  190. for (auto line = data->begin(); line; line++, i++)
  191. {
  192. if (i) of.write("\n", 1);
  193. int f = 0;
  194. for (auto field = line->begin(); field; field++, f++)
  195. {
  196. if (f) of.write("\0", 1);
  197. if ((Text*)field) of.write(field->getText(), field->getLength());
  198. }
  199. }
  200. of.close();
  201. return 1;
  202. }
  203. // constant
  204. int KSGTDatei::getZeilenAnzahl() const
  205. {
  206. return data->getEintragAnzahl();
  207. }
  208. int KSGTDatei::getFeldAnzahl(int zeile) const
  209. {
  210. int zA = getZeilenAnzahl();
  211. if (zeile >= zA) return 0;
  212. return data->z(zeile)->getEintragAnzahl();
  213. }
  214. Text* KSGTDatei::getFeld(int zeile, int feld) const
  215. {
  216. int zA = getZeilenAnzahl();
  217. if (zeile >= zA) return 0;
  218. int fA = getFeldAnzahl(zeile);
  219. if (feld >= fA) return 0;
  220. return data->z(zeile)->get(feld);
  221. }
  222. Text* KSGTDatei::zFeld(int zeile, int feld) const
  223. {
  224. int zA = getZeilenAnzahl();
  225. if (zeile >= zA) return 0;
  226. int fA = getFeldAnzahl(zeile);
  227. if (feld >= fA) return 0;
  228. return data->z(zeile)->z(feld);
  229. }