Dateischreiben funktioniert nicht

A3RO

Mitglied
Hi Leute,
ich programmiere grade eine art Telefonbuch als Übung und es funktioniert auch ^-^ naja...
es funktionierte mal , bis ich auf die Idee kam da einiges zu ändern ... naja egal , kann mir jemand sagen warum
der nix in die Datei schreibt?

C++:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define END 64  //64 = @ Zeichen//

FILE *fz;
int i, rep1, rep2, rep3, rep4;
int c;
char BASEPATH[] = "/home/merlin/Documents/Projekte/C/TelDatenbank/nummern.dat";
char trennlinie[] = "\n+------------------------------------------------+\n";
int e = 1;
int Nummer;
char Name[50];
char tab[] = "/t";

void clearkeyboard()
{
	while( ( c = getchar() ) != EOF && c != '\n' );
}

void Entry()
{
	if ((fz = fopen(BASEPATH, "a")) == NULL)
	{
		printf("ERROR 003");
		exit(4);
	}
	printf("Geben sie bitte die Telefonnummer ein und beenden sie die Eingabe indem sie <Enter> drücken");
	scanf("%d", &Nummer);
	clearkeyboard();

	clearkeyboard();
	printf("Geben sie jetz bitte ihren Nachnamen ein, dahinter ein Komma und dann ihren Vornamen! Beenden sie wieder in dem sie <Enter> drücken!");

	scanf("%s", Name);
	clearkeyboard();

	fprintf(fz,"%s\t%i\n", Name, Nummer);
}

void Baum()
{
	if ((fz = fopen(BASEPATH, "r")) == NULL)
	{
		printf("ERROR 001");
		exit(2);
	}

	printf("\033[2J");
	printf("Inhalt der Datei %s:\n\n", BASEPATH);
	i = 0;
	while ((c = fgetc(fz)) != EOF)
	{
		putchar(c);
		if (c == '\n')
			i++;
		if (i == 20)
		{
			printf("\n\nNächste Seite mit <Enter>.");
			getc(stdin);
			printf("\033[2J");
			i = 0;
			clearkeyboard();
		}
		fclose(fz);
	}
	exit(6);
}

int Question1()
{
	printf("Zum Starten <ENTER> drücken");
	clearkeyboard();
	printf("\n\nTelefonbuch zeigen(j)? Sonst 'n' für einen neuen Eintrag eingeben! (j/n)");
	rep1 = toupper(getc(stdin));
	if (rep1 == 'J')
	{
		if ((fz = fopen(BASEPATH, "r")) == NULL)
		{
			printf("\n\nFehler beim Öffnen der Datei.");
			exit(2);
		}

		clearkeyboard();
		printf("\033[2J");
		printf("Inhalt der Datei %s:\n\n", BASEPATH);
		i = 0;
		while ((c = fgetc(fz)) != EOF)
		{
			putchar(c);
			if (c == '\n')
				i++;
			if (i == 20)
			{
				printf("\n\nNächste Seite mit <Enter>.");
				getc(stdin);
				printf("\033[2J");
				i = 0;
			}
		}
		fclose(fz);
		clearkeyboard();
		return 1;
	}
	else
	{
		return 0;
	}
}

int Question2()
{
	while( ( c = getchar() ) != EOF && c != '\n' );
	printf("Wollen sie noch einen Eintrag hinzufügen?(j/n)");
	rep2 = toupper(getc(stdin));
	if (rep2 == 'N')
		return 0;
	else
	{
		return 1;
	}
}


int Question3()
{
	printf("Wollen sie noch einen Eintrag verfassen?(j/n)");
	rep3 = toupper(getc(stdin));

	if (rep3 == 'J')
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int Question4()
{
	clearkeyboard();
	printf("Wollen sie nochmal zum Anfang?(j/n)");
	rep4 = toupper(getc(stdin));

	if (rep4 == 'J')
	{
		return 1;
	}
	else
	{
		exit(5);
	}
}

int main()
{
	while (e < 4)
	{
		if (Question1() == 1)
		{
			clearkeyboard();

			if (Question2() == 1)
			{
				clearkeyboard();
				Entry();
				clearkeyboard();
				if (Question3() == 1)
				{
					goto A;
				}
				else
				{
					if (Question4())
					{

					}
				}
			}
			else
			{
				exit(7);
			}

		}
		else
		{
			A:
			Entry();
			clearkeyboard();

			if (Question3())
			{
				goto A;
			}
			else
			{
				if (Question4())
				{

				}
			}
		}
	}

	return EXIT_SUCCESS;
}

Das problem ist ganz am Anfang bei der Funktion "Entry"
System: Linux mint 17.1
Programm: Eclipse
Sprache: C
Includes: stdio.h
stdlib.h
ctype.h



LG
A3RO

Merke grade das meine kommentare im code SCH***** formatiert wurden :D (edit: Korrigiert)
Die kommis waren erst so schön in Boxen eigekreist :/
Wenn sich das jemand in sein eclipse kopiert... PASST ES AN!!!
 
Zuletzt bearbeitet von einem Moderator:
Die Einrückungen machen das unlesbar...moment...
edit: So, jetzt ists lesbarer...

Würde mich wundern, wenn sich jemand mit Eclipse ( :rolleyes: ) für C meldet. Die Leute dürften selten geworden sein
Wenn du gern einen Editor hast, der deine Kommentare nicht kaputtmacht, nimm was Besseres.

Bitte in Zukunft einige Dinge wie sinnvollen Titel selber machen
und nicht jedem Thema eine sinnlose Umfrage dazugeben. Danke
 
Zuletzt bearbeitet:
Ein paar erste Hinweise zum Code:

In Zeile 3 (define) darf kein Kommentar stehen.

Globale Variablen sind böse, und zwar viel mehr als goto.
Weg damit, Parameter und Returnwerte verwenden.

scanf für %s macht nicht das, was du erwartest, und clearkeyboard schaut fehleranfällig aus.
fgets...

Anweisungen wie \033[2J in printfs sind systemabhängig.

Zeile 66 ist garantiert falsch.

exit() in Funktionen soll nicht zum Normalfall werden
return und ordentliche Weiterverarbeitung in main (oder wo man sonst hinkommt)...

Der Code ist stellenweise stark redundant.
 
Sry ich muss mit globalen arbeiten , wird verlangt ... übung um in C reinzukommen :/
Clearkeyboard funzt 100% das Programm lief bis ich das mit der Datei geändert habe
Was soll ich bei scanf sonst machen? soll ja keine zahl werden
Jo das mit dem printf funzt eigentlich
Was ist mit 66 net richtig?
Die Main ist noch nicht fertig , alles noch WIP
Programmiere erst seit 2 Tagen mit C sonst hatte ich nur java und vb.NET und sql, sry
 
Zuletzt bearbeitet:
Bei Zeile 66 schließt du die Datei in einer Schleife wiederholt
(und die Schleife soll eigentlich aus der Datei einlesen, was nach dem ersten fclose nicht mehr funktionieren wird)

Und da, wo die Datei geschrieben wird, fehlt übrigens das fclose (hab ich vorher übersehen).
Vielleicht reicht das ja schon, damit Entry wieder funktioniert...

scanf mit %s kann/soll nichts EInlesen, was Leerzeichen etc. enthält.
Die schon erwähnte Funktion fgets mit der "Datei" stdin kann das besser.

Und zu der Vorgabe mit den globalen Variablen: Wenn irgendwie möglich, wechsle den Lehrer :D
 
Und zu der Vorgabe mit den globalen Variablen: Wenn irgendwie möglich, wechsle den Lehrer :D

Das einzige was ich mir vorstellen kann um die Vorgabe zu rechtfertigen ist, dass die Aufgabe lautet:
Löse die Problemstellung auf die Art, die sämtliche Funktionen und Abläufe komplett von jeglicher Reentrancy befreit.
 
Nicht
Lehrer sondern Chef :D und ich muss auch keine Globalen nutzen aber er meinte es wäre besser :D
Kp bin in der 9. Klasse und habe Praktikum
 
[...]und ich muss auch keine Globalen nutzen aber er meinte es wäre besser[...]

Globale Variablen sind meiner Meinung nach gefährlich und oft der Grund für unerwartetes Verhalten und Fehler. Vorallem bei komplexeren Systemen wird es immer schwieriger die Variablen zu warten und zu kontrollieren. Wenn möglich solltest du diese vermeiden und sauber über Parameter arbeiten. Wenns schnell gehen muss, zum Beispiel zum Debuggen, da kannst du die mal hernehmen.
Hier noch eine kleiner Artikel mit diversen Gründen: http://c2.com/cgi/wiki?GlobalVariablesAreBad

Grüße,
BK
 
Zuletzt bearbeitet:
Zurück