Dateibearbeitung Fragen und Probleme



  • Hallo Leute, als erstes möchte ich einmal sagen, dass ich neu hier im Forum bin 🙂

    Ich gehe in die 2. Klasse HTL EDV und programmiere derzeit nur in C. (windows 7)

    Jetzt haben wir gerade das Kapitel Dateibearbeitung, aber ich blicke mich da nicht so durch.

    Ein paar Sachen weiß ich: (wenn falsch bitte verbessern)

    Also zuerst wird ein File Pointer deklariert. Dieser hat den Typ FILE. Anschließend wird eine neue Datei mit fopen erstellt. Wie lautet die Syntax genau?

    fp = fopen("datei.txt", "w+") (z.b.?)

    Und meine eigentliche Frage:

    Wie kann ich dann etwas in diese Datei schreiben oder von dieser Lesen?
    Muss das eine Textdatei sein?

    Hier mal ein Code von einem HÜ-Beispiel:

    /*Programm, welches Artikeldaten (in der Struktur definiert) einliest, und in eine Datei speichert.Anschließend sollen diese Dateien 
    wieder ausgegeben werden, also zum Beispiel: datei7 und dann sollen die zuvor eingegebenen Daten wieder am Bildschirm stehen. 
    */
    
    #include <stdio.h>
    #include <conio.h>
    
    typedef struct
    {
    	int nr;
    	char bezeichnung[30];
    	char gruppe[20];
    	float preis;
    	int lagerbestand;
    } Artikel;
    
    void main()
    {
    	Artikel a;
    	FILE *fp;   //File-Pointer
    
    	fp = fopen("artikel.txt", "w+");	//Datei erstellen
    
    	//Wie muss ich hier weitermachen?
    
    	printf("Artikel einlesen\n\n");
    
    	printf("Nummer: ");
    	scanf("%d", &a.nr);
    
    	printf("Bezeichnung: ");
    	scanf("%s", &a.bezeichnung);
    
    	printf("Gruppe: ");
    	scanf("%s", &a.gruppe);
    
    	printf("Preis: ");
    	scanf("%f", &a.preis);
    
    	printf("Lagerbestand: ");
    	scanf("%d", &a.lagerbestand);
    }
    

    also ich verstehe das ganze nicht wie ich jetzt in eine datei schreiben kann und das dann wieder verwenden, und wie ich genau die wörter reinschreibe in die datei :S

    Vielen Dank schon mal 🙂


  • Mod

    Basti 13 schrieb:

    Also zuerst wird ein File Pointer deklariert. Dieser hat den Typ FILE. Anschließend wird eine neue Datei mit fopen erstellt. Wie lautet die Syntax genau?

    http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

    Wie kann ich dann etwas in diese Datei schreiben oder von dieser Lesen?

    Die ganzen Lesefunktionen die du kennst (oder auch nicht kennst) haben ein äquivalent, welches mit f beginn (scanf->fscanf), welches sich genau gleich (oder sehr ähnlich verhält) wie die "normale" Variante, aber noch einen Dateizeiger als Argument annimmt. Siehe:
    http://www.cplusplus.com/reference/clibrary/cstdio/

    Muss das eine Textdatei sein?

    In der Datei muss das stehen, was du sonst eingegeben hättest, wenn du die "normalen" Funktionen benutzt hättest. Je nachdem, was du genau machst, braucht das nicht unbedingt menschenlesbar zu sein.[



  • Ok, aber jetzt weiß ich trotzdem nicht, welche funktion etc. ich verwenden muss, ich wusste schon, dass es diese gibt, aber wie schreibe ich jetzt in eine datei und wie funktioniert das ganze?

    Hab eh schon gegooglet, aber nichts gutes gefunden 😕



  • Basti 13 schrieb:

    //Wie muss ich hier weitermachen?

    Was willst du da denn machen?
    An der Stelle hast du doch noch keine Daten.

    scanf("%s", &a.bezeichnung);// Bei %s kommt kein & vor den Variablennamen.
    

    Wenn du die Daten eingelesen hast, kannst du

    printf(    "%3d|%30s|\n", a.nr, a.bezeichnung);
    fprintf(fp, "%3d|%30s|\n", a.nr, a.bezeichnung);
    
    fclose(fp);
    

    machen.
    Die Datei kannst du mit dem Editor deiner Wahl ansehen.
    Auch den, mit dem du Programmierst.



  • Also ich habe jetzt herausgefunden, dass nach dem einlesen von a.bezeichnung:

    fputs (a.bezeichnung, fp);

    machen muss, damit er mir sie in die datei schreibt, ist das richtig so?

    und dann kann ich sie einfach mit printf("%s", a.bezeichnung") ausgeben..

    ok danke das hat ja schon mal funktioniert in meinem programm

    aber das lesen aus der datei habe ich jetz mit einem normalen printf gemacht, das stimmt aber nicht so, wenn man die dateibearbeitung macht, oder?



  • Basti 13 schrieb:

    Also ich habe jetzt herausgefunden, dass nach dem einlesen von a.bezeichnung:

    fputs (a.bezeichnung, fp);

    machen muss, damit er mir sie in die datei schreibt, ist das richtig so?

    fprintf(fp, "%s\n", a.bezeichnung); macht das auch.

    Basti 13 schrieb:

    und dann kann ich sie einfach mit printf("%s", a.bezeichnung") ausgeben..

    Vergleich mal mein Vorschlag mit deinem Beispiel eben.

    Basti 13 schrieb:

    aber das lesen aus der datei habe ich jetz mit einem normalen printf gemacht, das stimmt aber nicht so, wenn man die dateibearbeitung macht, oder?

    print heisst drucken, das ist zur Ausgabe da.
    Zum einlesen gibt es fscanf() oder fgets();

    Du solltest die Datei vorher schließen und danach mit fopen(Dateiname,"r"); wieder öffnen.

    Oder du setzt den Dateizeiger mit rewind() wieder auf den Anfang.

    Schau dir mal die Beispiele bei den Links an.



  • Ok, hab jetzt relativ viel verstanden von dem ganzen thema, da ich mein programm fast fertig habe:

    /* Name: Sebastian Schmidt
       Funktion: Einlesen der Daten von Artikeln und Ausgabe der Daten */
    
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    
    typedef struct
    {
    	int nr;
    	char bezeichnung[30];
    	char gruppe[20];
    	float preis;
    	int lagerbestand;
    } Artikel;
    
    void menue(wahl1, wahl2);
    
    void main()
    {
    	Artikel a;
    	FILE *fp;   //File-Pointer
    	int wahl1, wahl2, anzeige;
    
    	fp = fopen("artikel.txt", "w+");	//Datei erstellen
    
    	menue(&wahl1, &wahl2);
    
    	if(wahl1==1 || wahl2==1)
    	{
    		system("cls");
    
    		printf("Artikel einlesen\n\n");
    
    		printf("Nummer: ");
    		scanf("%d", &a.nr);
    		fprintf(fp, "%d, a.nr");			//In die Datei lesen
    
    		printf("Bezeichnung: ");
    		scanf("%s", a.bezeichnung);
    		fputs(a.bezeichnung, fp);
    
    		printf("Gruppe: ");
    		scanf("%s", a.gruppe);
    		fputs(a.gruppe, fp);
    
    		printf("Preis: ");
    		scanf("%f", &a.preis);
    		fprintf(fp, "%f, a.preis");	
    
    		printf("Lagerbestand: ");
    		scanf("%d", &a.lagerbestand);
    		fprintf(fp, "%d, a.lagerbestand");	
    	}
    
    	//Einlesen der Daten wurde beendet
    
    	system("cls");
    
    	menue(&wahl1, &wahl2);
    
    	//Artikel anzeigen
    
    	if(wahl1==2)
    	{
    		system("cls");
    
    		printf("Welchen Artikel moechten Sie anzeigen?");
    		printf("\n\nArt Nr: ");
    		scanf("%d", &anzeige);
    
    		if(anzeige==a.nr)
    		{
    			fscanf(fp, "%d, a.nr");		//Dateien am Bildschirm ausgeben
    			fgets(a.bezeichnung, 30, fp);
    			fgets(a.gruppe, 30, fp);
    			fscanf(fp, "%f, a.preis");
    			fscanf(fp, "%d, a.lagerbestand");
    		}
    
    		else
    			printf("Dieser Artikel ist noch nicht eingetragen.");
    	}
    
    	fclose(fp);
    
    	getch();
    }
    
    void menue(wahl1, wahl2)
    {
    	printf("Bitte waehlen Sie eine Funktion\n\n");
    
    	printf("<1> Neuen Artikel einlesen\n");
    	printf("<2> Artikel Anzeigen\n\n");
    
    	printf("Auswahl: ");
    	scanf("%d", wahl1);
    
    	if(wahl1==2)
    	{
    		system("cls");
    
    		printf("Sie muessen zuerst einen Artikel einlesen. Wollen Sie dies jetzt tun?\n\n");
    		printf("<1> Ja\n");
    		printf("<2> Nein\n\n");
    
    		printf("Auswahl: ");
    		scanf("%d", wahl2);
    	}
    
    	if(wahl2==1)
    		system("cls");
    }
    

    Aber bei den fscanf und fgets macht das Programm nichts. Und lese ich eigentlich in die Dateie ein, oder einfach direkt auf die Variablen? Weil wenn ich bei der Eingabe die scanf weg mache, dann geht es nicht. Es soll mit Dateiverarbeitung sein, da das gerade das aktuelle Thema in der Schule ist.

    Wieso gibt das nichts aus, wenn ich die Daten anzeigen lassen möchte?



  • Basti 13 schrieb:

    //In die Datei lesen

    Sehr merkwürdiger Ausdruck.
    Das lesen, schreiben wird vom Programm aus betrachtet. Du schreibst in die Datei oder du liest aus der Datei. -> reinschreiben und auslesen. (nicht reinlesen)

    Was fällt dir an folgenden Zeilen auf?

    scanf(    "%d", &a.lagerbestand);
    fscanf(fp, "%d, a.lagerbestand");
    

    Irgendwelche Unterschiede?

    Basti 13 schrieb:

    void menue(wahl1, wahl2)

    Du solltest schon den Variablentyp angeben. Als Standard wird zwar int angenommen, aber das ist sehr schlechter Stil.

    Bei einer Datei gibt es einen Zeiger der auf die Stelle verweist, an der aktuell geschrieben bzw. gelesen wird. Dieser Zeiger rückt mit jedem lesen/schreiben weiter.

    Wenn du jetzt Daten in eine neue Datei schreibst, steht der Zeiger immer auf dem Dateiende.
    Wenn du jetzt wieder Daten lesen willst, steht da dann nichts mehr.
    Du musst den Dateizeiger mit rewind() wieder auf den Anfang der Datei setzen.

    ⚠ Schalte alle Compilerwarnungen an und betrachte Warnungen wie Fehler.
    Dein Programm darf beim compilieren keine Warnungen erzeugen.
    Auch solche Fehler wie bei fscanf werden dann angemeckert.


Anmelden zum Antworten