Simulation einer Datenbankanwendung mit C/C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Simulation einer Datenbankanwendung mit C/C++

    Hallo,
    ich habe da mal ein Problem:

    und zwar will ich mit folgendem Programm die Datei mit dem Inhalt:

    name titel verlagsname erscheinungsjahr
    Überschrift steht nicht in der Datei.

    Quellcode

    1. J.K. Rowling Harry Potter and the Deathly Hallows Bloomsbury 2007
    2. Bernd Stromberg Langenscheidt Chef-Deutsch/Deutsch-Chef Langenscheidt 2007
    3. Nicola Sautter Besser Essen, Leben leicht gemacht Zabert Sandmann 2007
    4. Joanne K. Rowling Harry Potter Band 7, deutsche Ausgabe Carlsen 2007
    5. Hape Kerkeling Ich bin dann mal weg. Meine Reise... Malik 2006
    6. Sebastian Fitzek Amokspiel Droemer/Knaur 2007
    7. Kerstin Gier Fuer jede Loesung ein Problem Luebbe 2007
    8. Deborah Crombie So will ich schweigen Goldmann 2007

    einlesen und bearbeiten. Um das Programm übersichtlicher zu bekommen sollen zwei Strukturen verwendet werden.
    Nun habe ich erstmal die ganze Datei in ein char-Feld eingelesen und ausgegeben, das funktioniert auch.
    Wie bekomme ich aber die Datensätze in die Strukturen? Ich muss ja erst die ganze Datei durchlaufen, um die Anzahl der Datensätze zu ermitteln. Die Länge der Datensätze ist fest definiert.
    In der Struktur Buch soll jeweils der Datensatz aus der Datei gespeichert werden und der Index wird pro Datensatz um 1 erhöht.
    Der Ordnungsbegriff sollte dann aus dem Datensatz eindeutig gebildet werden.

    Danke für die Hilfe

    Quellcode

    1. #include <stdio.h>
    2. #include <errno.h>
    3. #include <stdlib.h>
    4. struct Buch
    5. {
    6. char name[21];
    7. char titel[41];
    8. char verlagsname[21];
    9. int erscheinungsjahr;
    10. };
    11. struct Index
    12. {
    13. char ordnungsbegriff[21];
    14. int position;
    15. };
    16. int main(int argc, char *argv[])
    17. {
    18. int result=0;
    19. int alert=0;
    20. int j, datensatz;
    21. unsigned int i;
    22. unsigned char zeile[1024], pix;
    23. FILE *datei;
    24. char *datei_file_name = "datei.dat";
    25. datei = fopen( datei_file_name, "r" );
    26. if ( datei == NULL )
    27. {
    28. fprintf ( stderr, "\nDatei konnte nicht geoeffnet werden '%s';\n",
    29. datei_file_name);
    30. exit (1);
    31. }
    32. printf("\nDatei wurde geoeffnet!\n");
    33. j=datensatz=0;
    34. for(i=0;i<sizeof(zeile);i++)
    35. {
    36. result=fscanf(datei,"%c", &pix);
    37. if(result == EOF || result != 1) //Fehlerbehandlung, ob Zeichen zum Einlesen vorhanden sind
    38. {
    39. alert=1;
    40. break;
    41. }
    42. else
    43. {
    44. zeile[i]=pix; //Abspeichern im neuen Feld
    45. j++;
    46. if(pix=='\n')
    47. datensatz++;
    48. alert=0;
    49. }
    50. }
    51. printf("\nEs wurden %d Datensaetze eingelesen.\n", datensatz);
    52. for(i=0;i<j;i++)
    53. {
    54. printf("%c", zeile[i]);
    55. }
    56. if( fclose(datei) == EOF )
    57. {
    58. fprintf ( stderr, "\nDatei konnte nicht geschlossen werden '%s';\n",
    59. datei_file_name);
    60. exit (1);
    61. }
    62. fflush(stdin);
    63. getchar();
    64. return 0;
    65. }
    Alles anzeigen
  • Strukturzugriff funktioniert

    Was jetzt noch nicht funktioniert:
    eindeutigen Ordnungsbegriff erstellen-> da verwende ich zur Zeit den Namen, aber der kann ja auch mehrmals vorkommen, also müsste der Ordnungsbegriff aus allen Elementen eines Datensatzes bestehen. Ich habe auch eine kleine Testsuche eingebaut, die mir dann den Datensatz anhand des Ordnungsbegriffes (dieser muss aber anders erstellt werden s.o.) heraussucht.
    und eine Sortierfunktion für den erstellten Ordnungsbegriff, die die Datensätze sortiert
    die neue Datei dient zur Abspeicherung der sortierten Datensätze
    Wer hat noch Verbesserungsvorschläge?
    Danke

    Quellcode

    1. #include <stdio.h>
    2. #include <errno.h>
    3. #include <stdlib.h>
    4. #define N 1000
    5. #define wertname 21
    6. #define werttitel 41
    7. #define wertverlagsname 21
    8. #define laenge 88
    9. struct Buch
    10. {
    11. char name[wertname];
    12. char begriff[21];
    13. char titel[werttitel];
    14. char verlagsname[wertverlagsname];
    15. char erscheinungsjahr[4];
    16. };
    17. struct Index
    18. {
    19. char ordnungsbegriff[21];
    20. int position;
    21. };
    22. int main(int argc, char *argv[])
    23. {
    24. int result=0, alert=0, j=0, datensatz=0, h, jahr, summe;
    25. unsigned int i;
    26. unsigned char zeile[N], pix;
    27. FILE *datei; /* input-file Pointer */
    28. char *datei_file_name = "datei.dat"; /* input-file Name */
    29. FILE *datei_out; /* output-file Pointer */
    30. char *datei_out_file_name = "datei.out.dat"; /* output-file Name */
    31. struct Index s_index[N]; //Struktur Index
    32. struct Buch s_buch[N]; //Strukturarray Buch
    33. datei = fopen( datei_file_name, "r" );
    34. if ( datei == NULL )
    35. {
    36. fprintf ( stderr, "\nDatei konnte nicht geoeffnet werden '%s';\n",
    37. datei_file_name);
    38. exit (1);
    39. }
    40. printf("\nDatei wurde geoeffnet!\n");
    41. for(i=0;i<sizeof(zeile);i++)
    42. {
    43. result=fscanf(datei,"%c", &pix);
    44. if(result == EOF || result != 1) //Fehlerbehandlung, ob Zeichen zum Einlesen vorhanden sind
    45. {
    46. alert=1;
    47. break;
    48. }
    49. else
    50. {
    51. zeile[i]=pix; //Abspeichern im Feld und in den Strukturen
    52. if((i>=0+datensatz*laenge)&&(i<21+datensatz*laenge))
    53. {
    54. s_buch[datensatz].name[i-(datensatz*laenge)]=pix;
    55. s_index[datensatz].ordnungsbegriff[i-(datensatz*laenge)]=pix;
    56. }
    57. if((i>=21+datensatz*laenge)&&(i<62+datensatz*laenge))
    58. {
    59. s_buch[datensatz].titel[i-21-(datensatz*laenge)]=pix;
    60. }
    61. if((i>=62+datensatz*laenge)&&(i<83+datensatz*laenge))
    62. {
    63. s_buch[datensatz].verlagsname[i-62-datensatz*laenge]=pix;
    64. }
    65. if((i>=83+datensatz*laenge)&&(i<87+datensatz*laenge))
    66. {
    67. s_buch[datensatz].erscheinungsjahr[i-83-datensatz*laenge]=pix;
    68. }
    69. j++; //Anzahl eingelesener Zeichen
    70. if(pix=='\n')
    71. {
    72. s_index[datensatz].position=datensatz+1;
    73. datensatz++;
    74. }
    75. alert=0;
    76. }
    77. }
    78. printf("\nEs wurden %d Datensaetze eingelesen.\n", datensatz);
    79. for(i=0; i<datensatz; i++) //Strukturinhalte ausgeben
    80. {
    81. printf("\nPosition: %d", s_index[i].position);
    82. //printf("\nName des %d Datensatzes: ", i+1);
    83. printf("\n");
    84. for(h=0; h<21; h++)
    85. {
    86. printf("%c", s_buch[i].name[h]);
    87. }
    88. //printf("\nTitel des %d Datensatzes: ", i+1);
    89. printf("\n");
    90. for(h=0; h<41; h++)
    91. {
    92. printf("%c", s_buch[i].titel[h]);
    93. }
    94. //printf("\nVerlagsname des %d Datensatzes: ", i+1);
    95. printf("\n");
    96. for(h=0; h<21; h++)
    97. {
    98. printf("%c", s_buch[i].verlagsname[h]);
    99. }
    100. //printf("\nErscheinungsjahr des %d Datensatzes: ", i+1);
    101. printf("\n");
    102. for(h=0; h<4; h++)
    103. {
    104. printf("%c", s_buch[i].erscheinungsjahr[h]);
    105. }
    106. //printf("\n");
    107. printf("\nOrdnungsbegriff des %d Datensatzes: ", i+1);
    108. for(h=0; h<21; h++)
    109. {
    110. printf("%c", s_index[i].ordnungsbegriff[h]);
    111. }
    112. printf("\n");
    113. }
    114. //Testausgaben:
    115. //s_index[datensatz].position=*s_index[datensatz].ordnungsbegriff;
    116. /*for(i=0;i<j;i++) //Ausgabe der Datensätze aus der Datei
    117. {
    118. printf("%c", zeile[i]);
    119. }*/
    120. //Ausgabe des zugehörigen Datensatzes zu einem gegeben Begriff:
    121. for(h=0; h<21; h++)
    122. {
    123. s_buch[0].begriff[h]=s_buch[2].name[h];
    124. }
    125. printf("\nDer Begriff lautet: ");
    126. for(h=0; h<21; h++)
    127. {
    128. printf("%c", s_buch[0].begriff[h]);
    129. }
    130. summe=0;
    131. for(i=0;i<datensatz;i++)
    132. {
    133. for(j=0;j<21;j++)
    134. {
    135. if(s_buch[0].begriff[j]==s_buch[i].name[j])
    136. summe=summe+1;
    137. if(summe==20)
    138. {
    139. printf("Datensatz gefunden:\n");
    140. for(h=0; h<21; h++)
    141. {
    142. printf("%c", s_buch[i].name[h]);
    143. }
    144. printf("\nPosition: %d", s_index[i].position);
    145. }
    146. else
    147. {
    148. printf("\nNicht gefunden!");
    149. }
    150. }
    151. }
    152. datei_out = fopen( datei_out_file_name, "w" );
    153. if ( datei_out == NULL )
    154. {
    155. fprintf ( stderr, "\nDatei konnte nicht geoeffnet werden '%s';\n",
    156. datei_out_file_name);
    157. exit (1);
    158. }
    159. printf("\nNeue Datei wurde erstellt!");
    160. if( fclose(datei) == EOF )
    161. {
    162. fprintf ( stderr, "\nDatei konnte nicht geschlossen werden '%s';\n",
    163. datei_file_name);
    164. exit (1);
    165. }
    166. if( fclose(datei_out) == EOF )
    167. {
    168. fprintf ( stderr, "\nDatei konnte nicht geschlossen werden '%s';\n",
    169. datei_out_file_name);
    170. exit (1);
    171. }
    172. fflush(stdin);
    173. getchar();
    174. return 0;
    175. }
    Alles anzeigen
  • Die Schleife ab Zeile 150 hatte noch einen kleinen Fehler:

    Quellcode

    1. for(i=0;i<datensatz;i++)
    2. {
    3. for(j=0;j<21;j++)
    4. {
    5. if(s_buch[0].begriff[j]==s_buch[i].name[j])
    6. summe=summe+1;
    7. if(summe==20)
    8. {
    9. printf("\nDatensatz gefunden: ");
    10. for(h=0; h<21; h++)
    11. {
    12. printf("%c", s_buch[i].name[h]);
    13. }
    14. printf("\nPosition: %d\n", s_index[i].position);
    15. }
    16. else
    17. {
    18. alert=alert+1;
    19. }
    20. }
    21. }
    22. if(alert>(datensatz*21))
    23. printf("\nNicht gefunden!\n");
    Alles anzeigen
  • Problem wurde von mir gelöst!

    Hallo, jetzt habe ich das Problem selber lösen können:

    Quellcode

    1. Simulation einer Datenbankverarbeitung Version 1.1
    2. -------------------------------------------------------------------------------
    3. Die Datei wurde geoeffnet.
    4. Es wurden XX Zeilen gelesen!
    5. Datensaetze wurden eingelesen.
    6. Es gibt folgende Ordnungsbegriffe:
    7. JHB.al BLLeaa NBZiea ...
    8. -------------------------------------------------------------------------------
    9. Bitte geben sie den Ordnungsbegriff (bitte Gross-und Kleinschreibung beachten)
    10. des Datensatzes an, den sie suchen wollen:
    11. Mit Enter bestaetigen!
    12. ->SADemr
    13. -------------------------------------------------------------------------------
    14. Suchergebnis:
    15. Datensatz gefunden:
    16. Sebastian_Fitzek
    17. Amokspiel
    18. Droemer/Knaur
    19. 2007
    20. Position: 6
    21. falls er doppelt vorkommt:
    22. Datensatz gefunden:
    23. Sebastian_Fitzek
    24. Amokspiel
    25. Droemer/Knaur
    26. 2007
    27. Position: 22
    28. -------------------------------------------------------------------------------
    29. Sortierfunktion starten (Enter druecken):
    30. Indices:
    31. 0 1 2 3 4 ...
    32. Sortierfunktion gestartet.
    33. Ergebnis des Sortierens:
    34. Ordnungsbegriffe wurden sortiert:
    35. Es wurde XXXmal getauscht.
    36. Neue Indices:
    37. 12 28 13 29 5...
    38. TSBecl TDBeil SADemr SADemr ...
    39. -------------------------------------------------------------------------------
    40. Tess_Gerritsen
    41. Schwesternmord
    42. Blanvalet
    43. 2007
    44. ----- ----- ----- ----- ----- -----
    45. Tess_Gerritsen
    46. Die_Chirurgin
    47. Blanvalet
    48. 2004
    49. ----- ----- ----- ----- ----- -----
    50. Sebastian_Fitzek
    51. Amokspiel
    52. Droemer/Knaur
    53. 2007
    54. ----- ----- ----- ----- ----- -----
    55. -------------------------------------------------------------------------------
    56. Sortierte Datensaetze wurden in Datei gespeichert!
    57. -------------------------------------------------------------------------------
    58. Programmende!
    59. Drücken Sie eine beliebige Taste . . .
    Alles anzeigen

    Wenn jemand die Lösung haben will, der kann sich ja bei mir melden!
    Gruß