fseek?



  • hab ein problem mit o.g. funktion. und zwar möchte ich eine vorhandene textdatei umändern..

    es soll an bestimmten stellen in versch. zeilen text ersetzt werden.. es kommt nicht auf ein bestimmtest wort an, sondern mehr auf die position..

    frage:

    kann es sein, dass wenn ich die datei schließe (fclose), und dann wieder öffne(fopen), mit fseek an die gewünschte stelle rücke und dann ein fputs oder fprintf mache, der komplette text verschwindet und nur der neue text an der stelle steht?? bei mir ist es so, darf ich kein fclose machen???



  • es ist gut möglich, das deine änderungen erst beim fclose() in die datei geschrieben werden, da die implementation von c gewisse operationen auf FILE strukturen cached. das heißt aber normalerweise, das es nix mit dem fclose() zu tun hat.

    post doch mal ein bischen code plz;)

    lg lolo



  • spaxx999 schrieb:

    kann es sein, dass wenn ich die datei schließe (fclose), und dann wieder öffne(fopen), mit fseek an die gewünschte stelle rücke und dann ein fputs oder fprintf mache, der komplette text verschwindet und nur der neue text an der stelle steht?? bei mir ist es so, darf ich kein fclose machen???

    Das hängt vom Modus beim Öffnen ab. Da gäbe es...

    r           open text file for reading
    w           truncate to zero length or create text file for writing
    a           append; open or create text file for writing at end-of-file
    rb          open binary file for reading
    wb          truncate to zero length or create binary file for writing
    ab          append; open or create binary file for writing at end-of-file
    r+          open text file for update (reading and writing)
    w+          truncate to zero length or create text file for update
    a+          append; open or create text file for update, writing at end-of-file
    r+b or rb+  open binary file for update (reading and writing)
    w+b or wb+  truncate to zero length or create binary file for update
    a+b or ab+  append; open or create binary file for update, writing at end-of-file
    

    fclose() musst du sowieso immer machen.
    🙂



  • zwei strukturen, prodListe und ProdInfo.. ProdInfo enthält preis und name, prodListe enthält ProdInfo und next-Zeiger...

    zuerst werden produkte eingelesen mit einlesenProdukt().. diese werden dann in einer schleife ausgegeben und dann abgespeichert, wo mein codeschnipsel beginnt.. nach dem abspeichern, sollen durch 3 neue produkte, 3 Zeilen aus der Datei überschrieben werden.. -> editiere()

    funktionen extern:

    void speicherProdukt (ProdInfo * prod)
    {	
    	static FILE * datei;
    	static int i = 1;
    
    	if (i==1)
    	{
    		datei = fopen("Produktinfo.TXT","w");
    	}
    	else 
    	{	
    		//datei = fopen("Produktinfo.TXT","a");
    	}
    	fprintf(datei, "%d. Produkt: \t Produktname:    %s \n \t \t Preis: \t %.2lf Euro\n", i++, prod->name, prod->preis);
            //fclose(datei);
    }
    

    zuerst hatte ich ein fclose drin, und fopen mit append-modus, dann wurde später nach dem fseek in "editiere()" alles entfernt...

    void editiere (void)
    {
    	FILE * datei;
    
    	ProdInfo *p1, *p2, *p3;
    
    	p1 = einlesenProdukt();
    	p2 = einlesenProdukt();
    	p3 = einlesenProdukt();
    
    	datei = fopen ( "Produktinfo.TXT" , "w+" );
    	fseek ( datei , 30 , SEEK_SET );
    	fputs ( "XXX" , datei );
    
    	fclose ( datei );
    
    }
    

    jetzt habe ich nur noch hier ein fclose drin, und nun wird nichts mehr überschrieben

    meine main

    while (aktuell) //aktuell ist die ProdListe
    	{
    		prod = naechstesProdukt (&aktuell);  /*liefert produkt zurück, springt ein element in der liste weiter*/
    		speicherProdukt (prod);  //s.o.
    
    	} 
    
    	// ersetzt 2 produkte (1.zeile und 3.zeile) und hängt eins an datei an
    	editiere();  //s.o.
    


  • wäre in der editiere() funktion ein "r+" vielleicht besser?



  • Vorschlag: du machst ein kompilierbares Beispiel, und ich denk drüber nach.
    🙂



  • okay, ich hab sie verpackt und auf mein webspace geladen..
    also die editiere() steckt in der prodliste.h, die speicherProdukt() in prodinfo.h

    habe noch ein paar änderungen vorgenommen, es scheint an dem "w+" gelegen zu haben, das habe ich in "r+" verändert (vor fseek)..

    jetzt würde mich noch interessieren, wie ich z.b. den preis(int) überschreibe, habe nur den name(string) verändert...

    programm: http://www.spaxx.bplaced.net/daten/Aufgabe2.5.rar

    Vielen Dank



  • spaxx999 schrieb:

    programm: http://www.spaxx.bplaced.net/daten/Aufgabe2.5.rar

    Bitte offene Formate verwenden.
    🙂





  • spaxx999 schrieb:

    gehts auch so?

    Aber nur dieses mal.

    Was sollte das Programm eigentlich tun?

    $ gcc main.c prodlist.c prodinfo.c
    main.c: In Funktion »main«:
    main.c:23: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »malloc«
    # usw.
    $ ./a.out
    Wieviele Produkte sollen eingelesen werden?
    1
    Bitte geben Sie den Produktnamen ein: 
    (1) Zeichen :  a
    (2) Zahlen :  1
    1. Produkt: 	 Produktname:    a   1 
     	 	 Preis: 	 118.00 Euro
    Bitte geben Sie den Produktnamen ein: 
    (1) Zeichen :  b
    (2) Zahlen :  2
    Bitte geben Sie den Produktnamen ein: 
    (1) Zeichen :  c
    (2) Zahlen :  3
    Bitte geben Sie den Produktnamen ein: 
    (1) Zeichen :  d
    (2) Zahlen :  3
    1. Produkt: 	 Produktname:    c   3 
    
     	 	 Preis: 	 118.00 Euro
    
    2. Produkt: 	 Produktname:    ??? 
    
     	 	 Preis: 	 ??? Euro
    $ hexdump -C Produktinfo.TXT 
    00000000  31 2e 20 50 72 6f 64 75  6b 74 3a 20 09 20 50 72  |1. Produkt: . Pr|
    00000010  6f 64 75 6b 74 6e 61 6d  65 3a 20 20 20 20 63 20  |oduktname:    c |
    00000020  20 20 33 20 0a 20 09 20  09 20 50 72 65 69 73 3a  |  3 . . . Preis:|
    00000030  20 09 20 31 31 38 2e 30  30 20 45 75 72 6f 0a 32  | . 118.00 Euro.2|
    00000040  2e 20 50 72 6f 64 75 6b  74 3a 20 09 20 50 72 6f  |. Produkt: . Pro|
    00000050  64 75 6b 74 6e 61 6d 65  3a 20 20 20 20 3f 3f 3f  |duktname:    ???|
    00000060  20 0a 20 09 20 09 20 50  72 65 69 73 3a 20 09 20  | . . . Preis: . |
    00000070  3f 3f 3f 20 45 75 72 6f  0a                       |??? Euro.|
    

    Sollte das so sein?

    spaxx999 schrieb:

    meinst du zip oder was ist offenes format??

    http://de.wikipedia.org/wiki/Offenes_Format
    Nimm ein tar.bz2 oder .7z oder sowas. Hauptsache es funktioniert und es ist offen.
    🙂


Anmelden zum Antworten