Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  fseek() - Verständnisproblem  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
sparrow12
Unregistrierter




Beitrag sparrow12 Unregistrierter 14:21:48 23.02.2012   Titel:   fseek() - Verständnisproblem            Zitieren

Hallo!

ich verstehe die funktion fseek nicht wirklich.

Code:
int fseek (FILE * stream, long offset, int whence);
 
Beschreibung:
Die Funktion fseek() setzt den Dateipositions-Zeiger der durch stream definierten
Datei auf die Position, die offset Bytes von whence entfernt ist.


Diesen Satz in der Beschreibung verstehe ich nicht. Die Funktion settzt den Cursor auf die Position die offset Bytes von whence entfernt ist.

Heißt das jetzt wenn ich schreibe z.B. fseek(file,0,SEEK_END), dann befindet sich der Curser am Ende oder? Da der Cursor auf die Position gesetzt wird, die offset Bytes(in dem Fall 0) vom Ende der Datei entfernt ist, kann der Cursor nur am Ende der Datei sein.

Was sind "offset Bytes"?

Und ftell fängt einfach von vorne und zählt die Bytes bis zum Cursor?

mfg sparrow
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23069
Beitrag rüdiger Moderator 14:27:32 23.02.2012   Titel:              Zitieren

Offset bedeutet einfach Abstand. "offset Bytes" soll andeuten, dass der Abstand in Bytes gemessen wird.
f.-th.
Unregistrierter




Beitrag f.-th. Unregistrierter 14:44:59 23.02.2012   Titel:              Zitieren

Hier gibt es ein Beispiel zu ab Position 9:
http://www.cplusplus.com/reference/clibrary/cstdio/fseek/

MfG f.-th.
sparrow12
Unregistrierter




Beitrag sparrow12 Unregistrierter 10:47:53 24.02.2012   Titel:              Zitieren

Ok, danke dann testen wir das gleich in eine Aufgabe^^.

Ich habe mehrere Termine in einem Binärfile gegeben. Ein Termin ist in die Struktur, die Datum_von, Datum_bis, Beschreibung, Teilnehmer etc. beinhaltet.

Und ich soll nun einen bestimmten Termin irgendwo zwischenfügen, z.B. diesen Termin zwischen 1. und 2. Termin im Binärfile einfügen.

Meine Idee war/ist mit fseek die Position herausfinden, das müsste klappen.

Aber danach wie man den Termin in das File einfügt weis ich nicht genau, dabei gehn sicher ein paar Termine verloren, weil wenn ich das file zum Schreiben öffne dann erstellt es ein neues und es steht nur der eine Termin drinnen der zwischen 1. und 2. Termin eingeschoben werden soll.
Und wenn ich das File im appendmode öffne dann wird der bestimmte Termin am Ende hinzugefügt richtig?

Gebt mir bitte paar Tipps wie ich das machenk könnte.

Hier der Ausschnitt:
C++:
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
termin* termin_einfügen(char filename[])
{
  FILE* inFile=NULL;
 
    termin* all_termin=NULL;
    termin termine;
 
    int len=0;
    int termin_zahl=0;
    int byte_anz=0;
 
//hier einfach irgendeinen Termin festlegen der eingefügt werden soll
 
    sprintf(termine.thema  ,"programmieren");
  strcpy(termine.beschreibung  ,"fseek ueben");
  strcpy(termine.teilnehmer  ,"ich");
    termine.von.jahr = 2012;
  termine.von.mon = 2;
    termine.von.tag = 24;
 
  termine.status = OFFEN;
    termine.priority = 1;
 
    inFile=fopen(filename,"w+b");
    if(inFile == NULL)
    {
      printf("Die datei %s konnte nicht geöffnet werden",filename);
        exit(-1);
    }
 
    fseek(inFile,0L,SEEK_END);
    len=ftell(inFile)/sizeof(termin);
 
  all_termin=(termin *)malloc(sizeof(termin)*len);
    if(all_termin != NULL)
    {
        printf("Geben Sie die Zahl des Termins ein, wo dann Ihr neuer Termin eingefügt werden soll:");// wenn man hier z.b. 3 eingibt dann wird der bestimmte Termin nach dem 3. Termin im binärfile eingefügt
        scanf("%d",&termin_zahl);
 
        byte_anz=sizeof(termin)*termin_zahl;
 
        fseek(inFile,byte_anz,SEEK_SET);
 
        fwrite(&termine,sizeof(termin),1,inFile);
    }
   
    else
    {
      printf("Memory allocation failure!");
    }
 
    return(all_termin);
}
B3rnDi
Unregistrierter




Beitrag B3rnDi Unregistrierter 11:05:11 24.02.2012   Titel:              Zitieren

Du liest Datei1 (Termine) und schreibst das Gelesene in Datei2, bis Du den Punkt erreichst, wo eingefügt werden soll. Hier schreibst Du den einzufügenden Satz in Datei2 und liest anschließend wieder Datei1 bis Ende und schreibst alles in Datei2.
So fügst Du quasi den Satz in Datei2 ein, verschiebst Datei2 auf Datei1 und keiner hat's gemerkt.
sparrow12
Unregistrierter




Beitrag sparrow12 Unregistrierter 15:16:27 24.02.2012   Titel:              Zitieren

Danke!

Deine Lösung ginge ja ganz ohne fseek oder?

Man öffnet Datei1 im rb-mode liest halt die ersten 3 Termine mit fread aus(wenn man nach dem 3. einfügen will). Diese 3 Termine schreibt man dann in Datei2 und hängt mittels appendreadmode den einzufügenden Termin dazu. Man lest Datei1 fertig aus und hängt es nach dem eingefügten Termin hinzu und dann lest mal die ganzen Termine aus und speichert diese in Datei1 wieder.

Wie geht das dann genau mit fseek?
Ein C-Progger
Unregistrierter




Beitrag Ein C-Progger Unregistrierter 15:49:17 24.02.2012   Titel:   Re: fseek() - Verständnisproblem            Zitieren

sparrow12 schrieb:
Was sind "offset Bytes"?

offset ist der Name des zweiten Parameters der Funktion. Falls dich die Formulierung verwirrt ersetze offset durch x. Dann würde dort stehen "x Bytes".
Ein C-Progger
Unregistrierter




Beitrag Ein C-Progger Unregistrierter 15:55:58 24.02.2012   Titel:              Zitieren

Zu deinem Problem: lese alle Einträge in dein Programm ein. Manipuliere im Speicher deine Einträge und schreibe diese anschließend in die Datei.

Ansonsten solltest du die Programmlogik und Datenhaltung voneinander trennen. Verwende doch eine Datenbank-Bibliothek, wie die "Berkeley DB" oder SQLite. Oder nutze das Dateisystem und schreibe eine Datei pro Eintrag. Alle Einträge findest du dann durch Iteration des Verzeichnisinhalts.
B3rnDi
Unregistrierter




Beitrag B3rnDi Unregistrierter 15:57:47 24.02.2012   Titel:              Zitieren

f.-th. hatte oben einen Link mit einem Beispiel gepostet.

Allerdings wird der Modus "a" immer dafür sorgen, dass Inhalt am Ende angehängt wird. Wenn Du in der selben Datei, an der Du anhängen möchtest den Filepointer positionieren willst, musst Du "a+" verwenden. Dennoch wird nicht an der Position des File-Pointers, sondern am Ende der Datei angefügt, wenn Du schreibst.

Ich kenne im Grunde nur diese Möglichkeit, die bereits beschrieben wurde: die Datei1 auslesen und Datei2 beschreiben, bis die passende Position erreicht ist, dann den Satz einfügen und wiederum Datei1 auslesen und Datei2 beschreiben, bis Datei1 am Ende ist.
sparrow12
Unregistrierter




Beitrag sparrow12 Unregistrierter 16:48:39 24.02.2012   Titel:              Zitieren

Danke euch!

B3rnDi, deine Version verstehe ich ok.

Sorry, Ein C-Progger, aber von solchen Datenbanken hab ich noch nie gehört und ich habe keine blassen Schimmer davon, da wir sowas noch nicht lernten.

Aber kennt den niemand eine lösung mit fseek? In meinem Programm oben habe ich ja fseek verwendet und es setzt den Cursor genau dorthin wo der Termin eingeschoben werden soll, aber wie es weiter geht weis ich halt nicht.
c++.de :: C (C89, C99 und C11) ::  fseek() - Verständnisproblem  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.