none
Programm Crashed wenn ich die Datei nach dem Laden versuche abzuspeichern RRS feed

  • Frage

  • Ich soll für die Schule ein "Telefonbuch" beispiel programmieren

    bei mir funktioniert das meiste im generellen funktioniert das speichern

    laden die eingabe etc.

    mein einziges Problem ist wenn ich eine Datei lade und sie dann versuche abzuspeichern stürzt das programm mit access violation ab.

    wenn ich mir die methode laden mit haltepunkten anschaue dann ladet er die zahlen in das Telefonbuch aber sobald er aus laden rausgeht und ich versuche das Telefonbuch anzuschauen dann kommt es aufs glück an ob er dann noch den inhalt hat.

    vllt ist noch hinzuzufügen das Laden und Speichern mit 1 Eintrag problemlos funktioniert aber ab 2-3 Einträge dann die fehlermeldung kommt.

    Er liest aber genau so ein wie er abspeichert

    case 2 ist noch nicht fertig deswegen braucht ihr euch das nicht anschauen

    ich glaub generell liegt der fehler irgentwo in der methode speichern oder laden

    // Telefonbuch_Poject_czacker.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>  // für isdigit funktion
    #include <conio.h>
    #pragma warning (disable:4996)
    
    #define STRINGMAX 40
    
    
    typedef struct Telefonbuch
    {
    
    	int tag, monat, jahr;
    	char titel[STRINGMAX];
    	char vorname[STRINGMAX];
    	char nachname[STRINGMAX];
    
    	char **adresse;
    	char **email;
    	char **telefonnummer; //weil Telefonnummer zu groß ist für int
    	int *plz;
    	char **ort;
    
    
    }Telefonbuch;
    
    //Prototypen
    char Menu();
    void speichern(Telefonbuch *telefonbuch, int anzahl);
    void clear();
    void Eingabe(Telefonbuch *telefonbuch, int groeße);
    void allokieren(Telefonbuch *telefonbuch, int groeße);
    int laden(Telefonbuch *telefonbuch, int *groeße);
    
    void austausch(Telefonbuch *telefonbuch, int max, int index)
    {
    	Telefonbuch platz;
    	//allokieren(platz, 1);
    	platz = telefonbuch[max];
    	telefonbuch[max] = telefonbuch[index];
    
    }
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Telefonbuch *telefonbuch;
    	static int groeße;
    	static char auswahl;
    	static int anzahl;
    	groeße = 1;
    
    	if ((telefonbuch = (Telefonbuch*)malloc((groeße)*sizeof(Telefonbuch))) == NULL)
    	{
    		printf("ERROR KEIN SPEICHERPLATZ");
    		return 1;
    	}
    
    	//Laden falls beim Start schon ein Telefonbuch vorhanden ist
    #pragma region start
    
    	static char *name;
    	FILE *start;
    
    	if ((name = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    	{
    		printf("Error");
    
    	}
    
    	clear();
    	name = "Telefonbuch.txt";
    
    	start = fopen(name, "r");
    	if ((start) != NULL)
    	{
    
    		fscanf(start, "%i", &groeße);
    		telefonbuch = (Telefonbuch*)realloc(telefonbuch, (groeße)*sizeof(Telefonbuch));
    
    		static int i;
    		for (i = 0; i < groeße; i++)
    		{
    
    			fscanf(start, "%s", telefonbuch[i].vorname);
    			fscanf(start, "%s", telefonbuch[i].nachname);
    			fscanf(start, "%s", telefonbuch[i].titel);
    
    			fscanf(start, "%i", &telefonbuch[i].jahr);
    			fscanf(start, "%i", &telefonbuch[i].monat);
    			fscanf(start, "%i", &telefonbuch[i].tag);
    
    			static int j, help;
    			fscanf(start, "%i", &help);
    			if ((telefonbuch[i].telefonnummer = (char**)malloc(help * sizeof(char*))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 2;
    			}
    
    			if ((telefonbuch[i].telefonnummer[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    
    			telefonbuch[i].telefonnummer[0] = (char*)help;
    
    			for (j = 1; j < help; j++)
    			{
    
    				if ((telefonbuch[i].telefonnummer[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    				{
    					printf("Error kein Speicherplatz");
    					return 4;
    				}
    
    				fscanf(start, "%s", telefonbuch[i].telefonnummer[j]);
    			}
    
    
    			fscanf(start, "%i", &help);
    			if ((telefonbuch[i].plz = (int*)malloc((help)* sizeof(int))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 11;
    			}
    
    			telefonbuch[i].plz[0] = help;
    			for (j = 1; j < help; j++)
    			{
    
    
    				fscanf(start, "%i", &telefonbuch[i].plz[j]);
    			}
    
    			fscanf(start, "%i", &help);
    			if ((telefonbuch[i].adresse = (char**)malloc(help* sizeof(char*))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 2;
    			}
    			if ((telefonbuch[i].adresse[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    
    			telefonbuch[i].adresse[0] = (char*)(help);
    			for (j = 1; j < help; j++)
    			{
    				if ((telefonbuch[i].adresse[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    				{
    					printf("Error kein Speicherplatz");
    					return 4;
    				}
    
    				fscanf(start, "%s", telefonbuch[i].adresse[j]);
    			}
    
    
    			fscanf(start, "%i", &help);
    			if ((telefonbuch[i].ort = (char**)malloc((help)* sizeof(char*))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 2;
    			}
    
    
    			if ((telefonbuch[i].ort[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    			telefonbuch[i].ort[0] = (char*)(help);
    			for (j = 1; j < help; j++)
    			{
    
    				if ((telefonbuch[i].ort[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    				{
    					printf("Error kein Speicherplatz");
    					return 4;
    				}
    
    				fscanf(start, "%s", telefonbuch[i].ort[j]);
    			}
    
    
    			if ((telefonbuch[i].email = (char**)malloc((help)* sizeof(char*))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 2;
    			}
    
    
    			if ((telefonbuch[i].email[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    
    			fscanf(start, "%i", &help);
    			telefonbuch[i].email[0] = (char*)(help);
    
    			for (j = 1; j < help; j++)
    			{
    				if ((telefonbuch[i].email[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    				{
    					printf("Error kein Speicherplatz");
    					return 4;
    				}
    
    				fscanf(start, "%s", telefonbuch[i].email[j]);
    			}
    		}
    		(groeße)++;
    		anzahl = groeße - 1;
    		printf("Telefonbuch gefunden\nLaden Erfolgreich");
    		getch();
    		fclose(start);
    		clear();
    	}
    
    #pragma endregion  
    
    	while (1)
    	{
    		auswahl = Menu();
    
    
    		switch (auswahl)
    		{
    		case '1':
    		{
    			clear();
    			telefonbuch = (Telefonbuch*)realloc(telefonbuch, (groeße)*sizeof(Telefonbuch));
    			allokieren(telefonbuch, groeße);
    			Eingabe(telefonbuch, ((groeße)-1));
    			groeße++;
    			clear();
    			anzahl = groeße - 1;
    			break;
    		}
    		case '2':
    		{
    			static char sucheing;
    			static int testen;
    			testen = 0;
    			do
    			{
    				clear();
    				printf("Nach Vorname suchen ('V')  ");
    				printf("\nNach Nachname suchen ('N')  ");
    				printf("\nNach Titel suchen ('T')  ");
    				printf("\nNach Ort suchen ('O')  ");
    				printf("\nNach PLZ suchen ('P')  ");
    				printf("\nNach GeburtsJahr suchen ('J')  ");
    				printf("\nNach Email suchen ('E')  ");
    				printf("\nZurueck ('Z')  ");
    				printf("\n\nIhre Eingabe bitte : ");
    				sucheing = getche();
    
    				switch (sucheing)
    				{
    				case 'v':
    				case 'V':
    				{ static char* name;
    				static int ergebnis;
    				static char c;
    					do
    					{
    						testen = 0;
    						printf("Nach welchen Namen suchen : ");
    						scanf("%s", name);
    						if (strlen(name) <= 2)
    						{
    							printf("\nDer gesuchte Name ist zu kurz\n");
    							testen = -1;
    
    						}
    						else
    						{
    							do {
    								c = name[testen];
    								if (isdigit(c))
    								{
    									testen = -1;
    									break;
    								}
    								testen++;
    
    							} while (!(c == '\0') && testen < 40);
    						}
    					} while (testen == -1 || strlen(name) < 2); //Name Überprüfen auf Zahlen
    
    					
    					for (testen = 0; testen < anzahl; testen++)
    					{
    						ergebnis=strcmp(telefonbuch[testen].vorname, name);
    
    					}
    
    				break; }
    
    				case 'n':
    				case 'N':
    				{printf("n"); break; }
    
    				case 't':
    				case 'T': {break; }
    
    				case 'o':
    				case 'O': { break; }
    
    				case 'p':
    				case 'P': { break; }
    
    				case 'j':
    				case 'J': { break; }
    
    				case 'e':
    				case 'E':
    				{break; }
    
    				case 'z':
    				case 'Z':
    				{break; }
    
    				default: { printf("\nFalsche eingabe");
    					sucheing = '1';
    					getch();
    					break; }
    				}
    			} while (sucheing == '1');
    
    
    			clear();
    
    			break;
    		}
    
    		case '3':
    		{
    
    			speichern(telefonbuch, anzahl);
    			getch();
    			clear();
    		}
    		break;
    		case '4':
    		{
    
    			if (laden(telefonbuch, &groeße) == (-1))
    			{
    				clear();
    				break;
    			}
    			anzahl = groeße - 1;
    			break;
    		}
    		case '5':
    		{
    #pragma region löschen
    
    			clear();
    			if (remove("Telefonbuch.txt") == 0)
    			{
    				printf("löschen Erfolgreich");
    				free(telefonbuch);
    
    				if ((telefonbuch = (Telefonbuch*)malloc((groeße)*sizeof(Telefonbuch))) == NULL)
    				{
    					printf("ERROR KEIN SPEICHERPLATZ");
    					return 1;
    				}
    				groeße = 1;
    				allokieren(telefonbuch, groeße);
    				getch();
    				clear();
    			}
    #pragma endregion
    			break;
    		}
    		case '6':
    		{
    			return 2;
    		}
    		default:
    		{
    			printf("\nFalsche Eingabe ");
    		}
    		}
    
    	}
    	getch();
    	return 0;
    }
    
    char Menu()
    {
    	char i;
    
    	printf("\n\tNeu (1)");
    	printf("\n\tSuchen (2)");
    	printf("\n\tAlle Speichern (Telefonbuch.txt) (3)");
    	printf("\n\tLaden (4)");
    	printf("\n\tganzes Telefonbuch Loeschen (5)");
    	printf("\n\tBeenden (6)");
    	printf("\n\nGeben Sie ein Was sie machen wollen (Zahl in der Klammer eingeben) ");
    	i = getche();
    
    	return i;
    
    }
    
    void speichern(Telefonbuch *telefonbuch, int anzahl)
    {
    
    	static int i,eingegeben;
    	FILE *speichern;
    	speichern = fopen("Telefonbuch.txt", "w");
    
    	fprintf(speichern, "%i\n", anzahl);
    	for (i = 0; i < anzahl; i++)
    	{
    		static int eingegeben, j;
    		fprintf(speichern, "%s\n", telefonbuch[i].vorname);
    		fprintf(speichern, "%s\n", telefonbuch[i].nachname);
    		fprintf(speichern, "%s\n", telefonbuch[i].titel);
    		fprintf(speichern, "%i\n", telefonbuch[i].jahr);
    		fprintf(speichern, "%i\n", telefonbuch[i].monat);
    		fprintf(speichern, "%i\n", telefonbuch[i].tag);
    
    		eingegeben = (int)telefonbuch[i].telefonnummer[0];
    		fprintf(speichern, "%i\n", eingegeben);
    		for (j = 1; j < eingegeben; j++)
    		{
    			fprintf(speichern, "%s\n", telefonbuch[i].telefonnummer[j]);
    		}
    
    
    		eingegeben = telefonbuch[i].plz[0];
    		fprintf(speichern, "%i\n", eingegeben);
    		for (j = 1; j < eingegeben; j++)
    		{
    			fprintf(speichern, "%i\n", telefonbuch[i].plz[j]);
    		}
    
    		eingegeben = telefonbuch[i].plz[0];
    		fprintf(speichern, "%i\n", eingegeben);
    		for (j = 1; j < eingegeben; j++)
    		{
    			fprintf(speichern, "%s\n", telefonbuch[i].adresse[j]);
    		}
    
    
    		eingegeben = telefonbuch[i].plz[0];
    		fprintf(speichern, "%i\n", eingegeben);
    		for (j = 1; j < eingegeben; j++)
    		{
    			fprintf(speichern, "%s\n", telefonbuch[i].ort[j]);
    		}
    
    
    
    		eingegeben = (int)telefonbuch[i].email[0];
    		fprintf(speichern, "%i\n", eingegeben);
    		for (j = 1; j < eingegeben; j++)
    		{
    			fprintf(speichern, "%s\n", telefonbuch[i].email[j]);
    		}
    
    		fflush(speichern);
    
    	}
    	fclose(speichern);
    	printf("\nAlle erfolgreich gespeichert unter Ausgabe ");
    
    }
    
    void clear()
    {
    	system("cls");
    }
    
    void Eingabe(Telefonbuch *eingabe, int groeße)
    {
    	static char auswahl, c;
    	static int anzahl, testen;
    	c = '0';
    	anzahl = 2;
    	testen = 0;
    	do
    	{
    		clear();
    #pragma region vorname
    		do
    		{
    			testen = 0;
    			printf("Vorname (abstaende mit _ ) : ");
    			scanf("%s", eingabe[groeße].vorname);
    			if (strlen(eingabe[groeße].vorname) <= 2)
    			{
    				printf("\nIhr Name wird wohl nicht so kurz sein...\n");
    				testen = -1;
    
    			}
    			else
    			{
    				do {
    					c = eingabe[groeße].vorname[testen];
    					if (isdigit(c))
    					{
    						testen = -1;
    
    						break;
    					}
    					testen++;
    
    				} while (!(c == '\0') && testen < 40);
    			}
    		} while (testen == -1 || strlen(eingabe[groeße].vorname) < 2);
    #pragma endregion
    #pragma region nachname
    		do
    		{
    			testen = 0;
    			printf("\nNachname : ");
    			scanf("%s", eingabe[groeße].nachname);
    			if (strlen(eingabe[groeße].nachname) <= 2)
    			{
    				printf("\nIhr Name wird wohl nicht so kurz sein...\n");
    				testen = -1;
    
    			}
    			else
    			{
    				do {
    					c = eingabe[groeße].nachname[testen];
    					if (isdigit(c))
    					{
    						testen = -1;
    
    						break;
    					}
    					testen++;
    
    				} while (!(c == '\0') && testen < 40);
    			}
    
    		} while (testen == -1 || strlen(eingabe[groeße].nachname) < 2);
    #pragma endregion
    #pragma region titel
    		do
    		{
    			testen = 0;
    			printf("\nTitel (abstaende mit _ ) : ");
    			scanf("%s", eingabe[groeße].titel);
    			if (strlen(eingabe[groeße].titel) < 2)
    			{
    				printf("\nIhr Titel wird wohl nicht so kurz sein...\n");
    				testen = -1;
    			}
    			else
    			{
    				do {
    					c = eingabe[groeße].vorname[testen];
    					if (isdigit(c))
    					{
    						testen = -1;
    
    						break;
    					}
    					testen++;
    
    				} while (!(c == '\0') && testen < 40);
    			}
    		} while (strlen(eingabe[groeße].titel) < 2 || testen == -1);
    #pragma endregion
    #pragma region Jahr
    		do
    		{
    			printf("\nGeburtsJAHR (JJJJ) : ");
    			scanf("%i", &(eingabe[groeße].jahr));
    
    			do
    			{
    				c = getchar();
    			} while (!(c == '\n'));
    
    
    		} while (eingabe[groeße].jahr < 1960 || eingabe[groeße].jahr > 2015);
    #pragma endregion
    #pragma region monat
    		do
    		{
    			printf("\nGeburtsmonat (MM) : ");
    			scanf("%i", &(eingabe[groeße].monat));
    
    			do
    			{
    				c = getchar();
    			} while (!(c == '\n'));
    
    
    
    
    		} while (eingabe[groeße].monat < 1 || eingabe[groeße].monat > 12);
    #pragma endregion
    #pragma region tag
    		do
    		{
    			printf("\nGeburtstag (TT) : ");
    			scanf("%i", &(eingabe[groeße].tag));
    
    			do
    			{
    				c = getchar();
    			} while (!(c == '\n'));
    
    
    
    
    		} while (eingabe[groeße].tag < 1 || eingabe[groeße].tag > 31);
    #pragma endregion
    #pragma region telefonnummer
    		anzahl = ((int)(eingabe[groeße].telefonnummer[0]) + 1);
    		do
    		{
    			eingabe[groeße].telefonnummer = (char**)realloc(eingabe[groeße].telefonnummer, anzahl*sizeof(char*));
    			eingabe[groeße].telefonnummer[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char));
    
    			do {
    				testen = 0;
    				printf("\nGeben Sie ihre Telefonnummer ein : ");
    				scanf("%s", (eingabe[groeße].telefonnummer[anzahl - 1]));
    				do
    				{
    					c = eingabe[groeße].telefonnummer[anzahl - 1][testen];
    					if (!isdigit(c))
    					{
    						testen = -1;
    
    						break;
    					}
    					testen++;
    				} while (!(c == '\0') && testen < 40);
    			} while (testen == -1 && c !='\0');
    
    			printf("\nWollen sie noch eine Nummer einlesen? ('n' abbrechen) : ");
    			auswahl = getche();
    			printf("\n");
    			eingabe[groeße].telefonnummer[0] = (char*)anzahl;
    			anzahl++;
    		} while (auswahl != 'n');
    #pragma endregion
    #pragma region adressen
    		anzahl = eingabe[groeße].plz[0] + 1;
    		do
    		{
    			eingabe[groeße].adresse = (char**)realloc(eingabe[groeße].adresse, anzahl*sizeof(char*));
    			eingabe[groeße].adresse[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char));
    			printf("\nGeben Sie ihre Adresse ein (Strasse/Nummer) : ");
    			scanf("%s", eingabe[groeße].adresse[anzahl - 1]);
    
    
    			eingabe[groeße].ort = (char**)realloc(eingabe[groeße].ort, anzahl*sizeof(char*));
    			eingabe[groeße].ort[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char));
    			do
    			{
    				testen = 0;
    				printf("\nGeben Sie ihre Ort ein (Wien etc.) : ");
    				scanf("%s", eingabe[groeße].ort[anzahl - 1]);
    
    				do {
    					c = eingabe[groeße].ort[anzahl - 1][testen];
    					if (isdigit(c))
    					{
    						testen = -1;
    
    						break;
    					}
    					testen++;
    
    				} while (!(c == '\0') && testen < 40);
    			} while (testen == -1);
    
    
    
    			eingabe[groeße].plz = (int*)realloc(eingabe[groeße].plz, anzahl*sizeof(int));
    			do
    			{
    				printf("\nGeben Sie ihre PLZ ein : ");
    				scanf("%i", &(eingabe[groeße].plz[anzahl - 1]));
    				do
    				{
    					c = getchar();
    				} while (!(c == '\n') );
    			} while (eingabe[groeße].plz[anzahl - 1] <= 900);
    
    			eingabe[groeße].plz[0] = anzahl;
    			anzahl++;
    			printf("\nNoch eine Adresse einlesen? ('n' zum Abbrechen) ");
    			auswahl = getche();
    			printf("\n");
    		} while (auswahl != 'n');
    #pragma endregion
    #pragma region email
    		anzahl = (int)eingabe[groeße].email[0] + 1;
    		do
    		{
    			auswahl = 'y';
    			eingabe[groeße].email = (char**)realloc(eingabe[groeße].email, anzahl*sizeof(char*));
    			eingabe[groeße].email[anzahl - 1] = (char*)malloc(STRINGMAX*sizeof(char));
    			printf("\n\nGeben Sie ihre email ein : ");
    			scanf("%s", eingabe[groeße].email[anzahl - 1]);
    
    			if ((strstr(eingabe[groeße].email[anzahl - 1], "@")) != NULL)
    			{
    				printf("\nNoch eine email einlesen? ('n' zum Abbrechen) ");
    				auswahl = getche();
    
    				eingabe[groeße].email[0] = (char*)anzahl;
    				anzahl++;
    				printf("\n");
    			}
    		} while (auswahl != 'n');
    #pragma endregion
    
    		printf("\nStimmen die obigen Angaben? J/N");
    		auswahl = getche();
    	} while (auswahl != 'J' && auswahl != 'j');
    
    }
    
    void allokieren(Telefonbuch *telefonbuch, int groeße)
    {
    	if ((telefonbuch[groeße - 1].telefonnummer = (char**)malloc(1 * sizeof(char*))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    	}
    
    	if ((telefonbuch[groeße - 1].telefonnummer[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    	}
    
    	if ((telefonbuch[groeße - 1].plz = (int*)malloc(1 * sizeof(int))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    	}
    
    
    	if ((telefonbuch[groeße - 1].ort = (char**)malloc(1 * sizeof(char*))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    
    	}
    
    
    	if ((telefonbuch[groeße - 1].ort[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    	}
    
    
    
    	if ((telefonbuch[groeße - 1].adresse = (char**)malloc(1 * sizeof(char*))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    
    	}
    
    
    	if ((telefonbuch[groeße - 1].adresse[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    	}
    
    	if ((telefonbuch[groeße - 1].email = (char**)malloc(1 * sizeof(char*))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    
    	}
    
    
    	if ((telefonbuch[groeße - 1].email[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    	{
    		printf("Error kein Speicherplatz");
    
    	}
    	telefonbuch[groeße - 1].plz[0] = 1;
    	telefonbuch[groeße - 1].email[0] = (char*)1;
    	telefonbuch[groeße - 1].telefonnummer[0] = (char*)1;
    }
    
    int laden(Telefonbuch *telefonbuch, int *groeße)
    {
    #pragma region laden
    
    	static char *name;
    	FILE *laden;
    
    	if ((name = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    	{
    		printf("Error");
    		return 0;
    	}
    	do
    	{
    		clear();
    		printf("Geben Sie die zu ladene Textdatei ein\nSie muss im selben Pfad sein (abbrechen 'n') :");
    		scanf("%s", name);
    
    		laden = fopen(name, "r");
    		if ((laden) == NULL && name[0] != 'n')
    		{
    			printf("\nDatei nicht gefunden");
    			getch();
    		}
    	} while (laden == NULL && name[0] != 'n');
    	if (name[0] == 'n')
    	{
    		clear();
    		return -1;
    	}
    	fscanf(laden, "%i", groeße);
    	telefonbuch = (Telefonbuch*)realloc(telefonbuch, (*groeße)*sizeof(Telefonbuch));
    	static int i;
    	for (i = 0; i < (*groeße); i++)
    	{
    		static int j, help;
    
    		fscanf(laden, "%s", telefonbuch[i].vorname);
    		fscanf(laden, "%s", telefonbuch[i].nachname);
    		fscanf(laden, "%s", telefonbuch[i].titel);
    
    		fscanf(laden, "%i", &telefonbuch[i].jahr);
    		fscanf(laden, "%i", &telefonbuch[i].monat);
    		fscanf(laden, "%i", &telefonbuch[i].tag);
    
    		fscanf(laden, "%i", &help);
    		if ((telefonbuch[i].telefonnummer = (char**)malloc(help * sizeof(char*))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 2;
    		}
    
    		if ((telefonbuch[i].telefonnummer[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 4;
    		}
    
    		telefonbuch[i].telefonnummer[0] = (char*)help;
    
    		for (j = 1; j < help; j++)
    		{
    
    			if ((telefonbuch[i].telefonnummer[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    
    			fscanf(laden, "%s", telefonbuch[i].telefonnummer[j]);
    		}
    
    
    		fscanf(laden, "%i", &help);
    		if ((telefonbuch[i].plz = (int*)malloc((help)* sizeof(int))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 11;
    		}
    
    		telefonbuch[i].plz[0] = help;
    		for (j = 1; j < help; j++)
    		{
    
    
    			fscanf(laden, "%i", &telefonbuch[i].plz[j]);
    		}
    
    		fscanf(laden, "%i", &help);
    		if ((telefonbuch[i].adresse = (char**)malloc(help* sizeof(char*))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 2;
    		}
    		if ((telefonbuch[i].adresse[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 4;
    		}
    
    		telefonbuch[i].adresse[0] = (char*)(help);
    		for (j = 1; j < help; j++)
    		{
    			if ((telefonbuch[i].adresse[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    
    			fscanf(laden, "%s", telefonbuch[i].adresse[j]);
    		}
    
    
    		fscanf(laden, "%i", &help);
    		if ((telefonbuch[i].ort = (char**)malloc((help)* sizeof(char*))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 2;
    		}
    
    
    		if ((telefonbuch[i].ort[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 4;
    		}
    		telefonbuch[i].ort[0] = (char*)(help);
    		for (j = 1; j < help; j++)
    		{
    			if ((telefonbuch[i].ort[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    
    			fscanf(laden, "%s", telefonbuch[i].ort[j]);
    		}
    
    
    		if ((telefonbuch[i].email = (char**)malloc((help)* sizeof(char*))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 2;
    		}
    
    
    		if ((telefonbuch[i].email[0] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    		{
    			printf("Error kein Speicherplatz");
    			return 4;
    		}
    
    		fscanf(laden, "%i", &help);
    		telefonbuch[i].email[0] = (char*)(help);
    
    		for (j = 1; j < help; j++)
    		{
    			if ((telefonbuch[i].email[j] = (char*)malloc(STRINGMAX*sizeof(char))) == NULL)
    			{
    				printf("Error kein Speicherplatz");
    				return 4;
    			}
    
    			fscanf(laden, "%s", telefonbuch[i].email[j]);
    		}
    
    	}
    	(*groeße)++;
    	printf("\nLaden Erfolgreich");
    	getch();
    	clear();
    	return 0;
    #pragma endregion
    }

    Montag, 9. November 2015 13:31

Antworten

  • Hallo,

    Du übergibst in der Funktion einen Zeiger auf telefonbuch Struktur, also der Zeiger wird "by value" in der Funktion übergeben d.h. eine Kopie der Adresse von telefonbuch wird im Stack angelegt. Beim Allokieren wird die Adresse dem Zeiger, der sich im Stack befindet,  zugewiesen. Dein Originalzeiger bleibt in diesem Fall uninitialisiert. Nach dem Verlassen der Funktion wird  der Stack gelöscht und die Adresse des allokierten Speichers ist  auch weg.
    Richtig wäre  ein Zeiger auf Zeiger zu übergeben.

    nt laden(Telefonbuch **telefonbuch, int *groeße);

    Grüße

    Montag, 9. November 2015 22:13

Alle Antworten

  • Hallo Ephaltes,

    hast Du schon einmal versucht Dein Programm zu debuggen? Ich denke nicht. Ich würde Dir den Ratschlag geben dieses zu tun. In der Beschreibung hast Du ja genau beschrieben, was Du tun mußt für dne Absturz. Daher würde ich (ohne Dein Code genauer anzuschauen) Dir den Tip geben einfach mal einen Brakepoint am Anfang Deines Speicher Codes zu setzen, und dann Schritt für Schritt durchzusteppen.

    Software Entwicklung ist halt nicht nur Code zu schreiben, sondern auch Fehler zu suchen. Nutze diesen Fall gleich, den Debugger dr IDE kennne zu lernen.


    Best regards

    Bordon

    Note: Posted code pieces may not have a good programming style and may not perfect. It is also possible that they do not work in all situations. Code pieces are only indended to explain something particualar.

    Montag, 9. November 2015 14:17
  • ok

    ich habe das programm jetzt debugged und es scheint als wäre während man die methode Laden ausführt alles in ordnung sprich alles wird richtig geladen, gespeichert ausgeführt etc.

    aber sobald er die methode laden verlässt wäre es so als wäre er nie reingekommen

    sprich die ganzen geladenen daten gibt es nicht mehr alles wegradiert, die angelegten sachen auch

    aber ich übergebe ihn doch den pointer telefonbuch welches er bearbeiten kann oder? (wie in C# der ref parameter)

    oder hab ich da gerade einen denkfehler?

    Montag, 9. November 2015 16:19
  • Hallo,

    Du übergibst in der Funktion einen Zeiger auf telefonbuch Struktur, also der Zeiger wird "by value" in der Funktion übergeben d.h. eine Kopie der Adresse von telefonbuch wird im Stack angelegt. Beim Allokieren wird die Adresse dem Zeiger, der sich im Stack befindet,  zugewiesen. Dein Originalzeiger bleibt in diesem Fall uninitialisiert. Nach dem Verlassen der Funktion wird  der Stack gelöscht und die Adresse des allokierten Speichers ist  auch weg.
    Richtig wäre  ein Zeiger auf Zeiger zu übergeben.

    nt laden(Telefonbuch **telefonbuch, int *groeße);

    Grüße

    Montag, 9. November 2015 22:13