You are not logged in.

  • Login

1

Monday, March 26th 2007, 5:22pm

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.

Bash

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

C Quellcode

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

2

Wednesday, March 28th 2007, 9:44am

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

C Quellcode

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

3

Wednesday, March 28th 2007, 9:58am

Korrektur

Die Schleife ab Zeile 150 hatte noch einen kleinen Fehler:

C Quellcode

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

4

Wednesday, April 4th 2007, 5:50pm

Problem wurde von mir gelöst!

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

Bash

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

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

Similar threads

Social bookmarks