| Autor |
Nachricht |
sparrow12
Unregistrierter
|
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
|
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
|
f.-th. Unregistrierter
14:44:59 23.02.2012 Titel: |
|
Zitieren |
|
 |
sparrow12
Unregistrierter
|
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
|
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
|
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
|
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
|
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
|
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
|
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. |
|
|
|
 |
|
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.
|
|
|
|
|