WinFuture-Forum.de: [gelöst]c Und Fseek() - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[gelöst]c Und Fseek() An eine beliebige Position springen


#1 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 25. Mai 2010 - 22:19

Hi,

ich habe hier ein kleines Problem in C.
Ich öffne hier eine Datei die im Normalfall leer ist. Falls die Datei nich vorhanden ist, dann wird Sie erzeugt.
sp_file = fopen(str_Path,"a+");


Nun möchte ich der leeren Datei an eine bestimmte Stelle springen.
Dafür gibt es ja die Funktion fseek(), leider fuktioniert das hier nicht so ganz.

Wenn ich folgenden Aufruf mache:
fseek(SP,20L,SEEK_SET);

dann müsste mein schreib zeiger ja um 20 Byte (Zeichen) nach vom Anfang weg verschoben sein!?
wenn ich dann mit
fputs("Hans",SP);

versuche das wort Hans in die Datei zu schreiben, steht es immer am Anfang und nicht an der 20 (oder besser gesagt 21 Stelle).

Weiß da jemand rat?

lg,
Fabi

Dieser Beitrag wurde von Fabi bearbeitet: 01. Juni 2010 - 16:26

0

Anzeige



#2 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.115
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 25. Mai 2010 - 22:51

Ich denke mal es liegt daran, wie Du die Datei öffnest ("a+"):

Zitat

Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist.
Man kann also wild hin und her springen, aber sobald man was schreiben will, springt der Filepointer ans Ende der Datei, was bei einer leeren Datei auch dem Anfang entspricht.

Was gibt denn fseek() zurück? Falls ungleich 0, gibt errno vielleicht Auskunft über das Problem.
0

#3 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 25. Mai 2010 - 22:52

hmm
wenn ein haus 20 etagen hat
und du willst zu etage 25 springen was denkst du wohl was passiert? ;)

ich denk ma du müsstest erst noch 19 leerzeichen einfügen da du nur an vorhandene positionen springen kannst ;)

ich weiss es nicht genau aber alles andere wäre für mich unlogisch

greetz
0

#4 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 26. Mai 2010 - 08:09

erstmal vielen dank für die hilfe.

@Mr. Floppy:

Zitat

Ich denke mal es liegt daran, wie Du die Datei öffnest ("a+"):

Zitat

Man kann also wild hin und her springen, aber sobald man was schreiben will, springt der Filepointer ans Ende der Datei, was bei einer leeren Datei auch dem Anfang entspricht.

gibts da vielleicht ne andere funktion die das leisten könnte. oder müsste ich die datei dann einfach mit w+ (alternativ dürfte auch r+ gehen!?) öffnen?
müsste ich halt überprüfen ob es die datei gibt, falls ja wird sie mit a+ erzeugt und geschlossen und dann mit w+ geöffnet.
ansonsten fülle ich den rest einfach mit nullen auf ;).

@skelle:

Zitat

hmm
wenn ein haus 20 etagen hat
und du willst zu etage 25 springen was denkst du wohl was passiert?

das ist ein echt passender vergleich, aber selbst nach dem ich was in die datei geschrieben hatte, dass z.B. 30 Zeichen lang war, konnte ich nicht an Stelle 3 springen und was einfügen.
lag wohl doch an dem a+.
0

#5 Mitglied ist offline   skelle 

  • Gruppe: aktive Mitglieder
  • Beiträge: 793
  • Beigetreten: 15. Juli 04
  • Reputation: 0

geschrieben 27. Mai 2010 - 19:21

ok alles klar ;-)
0

#6 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 27. Mai 2010 - 22:45

Also wenn ich die Option a+ durch r+ ersetze, dann geht es.

Vielen Dank für die Hilfe.

lg,
Fabi
0

#7 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 28. Mai 2010 - 14:26

ich hätte da noch eine Frage, wie kann ich eine Struktur (struct) über ein Header-File in mehreren Dateien bekannt machen?

lg,
Fabi
0

#8 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 28. Mai 2010 - 15:22

In jeder Datei das Header-File #include'n?
0

#9 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 30. Mai 2010 - 14:23

Zitat

In jeder Datei das Header-File #include'n?

na das ist mir schon klar. :rolleyes:

aber muss ich die struktur dann in dem headerfile nochmal mit allen variablen definieren, oder kann ich die auch mit dem Befehl extern, wie die funktionen, einbinden.

das ist das eigentlich problem. und i.w. find ich da absolut nichts passendes dazu.

lg,
Fabi
0

#10 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 31. Mai 2010 - 07:14

Möchtest du womöglich auf include guards hinaus?
0

#11 _Fenix_

  • Gruppe: Gäste

geschrieben 31. Mai 2010 - 08:31

Möchtest du das struct als Datentyp?
list.h:
typedef struct _list {
  int content;
  _list * next;
} list;


Oder willst du eine globale Variable?
list.h:
typedef struct _list {
  int content;
  _list * next;
} list;

list foo_list;

list.c:
void init_foo() {
  foo_list.content = (int)0xDEADBABE;
  foo_list.next = NULL;
}


Allerdings sind globale Variablen mit Vorsicht zu genießen, meistens designt man irgendwas unsauber, wenn man sie benutzen muss. Im Zweifelsfall würde ich lieber den Heap verwenden:
list.c:
list * init_foo() {
  list * foo_list = (foo_list*)malloc(sizeof(foo_list));
  foo_list->content = (int)0xDEADBABE;
  foo_list->next = NULL;
  return foo_list;
}

foo_list * destroy_foo_list(list * foo_list) {
  free(foo_list);
  return NULL;
}

Dann den Pointer auf die einmal erzeugte foo_list allen Funktionen übergeben, die die foo_list brauchen.

Wenn du foo_list in mehreren Programmen willst, brauchst du
shared memory.

Dieser Beitrag wurde von Fenix bearbeitet: 31. Mai 2010 - 08:33

0

#12 Mitglied ist offline   basti2k 

  • Gruppe: Mitglieder
  • Beiträge: 2
  • Beigetreten: 31. Mai 10
  • Reputation: 0

geschrieben 31. Mai 2010 - 08:46

Beitrag anzeigenZitat (Fabi: 26.05.2010, 09:09)

gibts da vielleicht ne andere funktion die das leisten könnte. oder müsste ich die datei dann einfach mit w+ (alternativ dürfte auch r+ gehen!?) öffnen?
müsste ich halt überprüfen ob es die datei gibt, falls ja wird sie mit a+ erzeugt und geschlossen und dann mit w+ geöffnet.
ansonsten fülle ich den rest einfach mit nullen auf :rolleyes:.


Also wenn du eine Datei mit r+ öffnest und eine Datei von z.B. 5 Bytes vorzuliegen hast und an die Stelle 10 springst und was in die Datei schreibst, so wird das in der Datei fehlende Stück automatisch mit 0x00 aufgefüllt.

Noch ein Tipp fürs Datei öffnen:
FILE * fp = fopen(filename,"r+");
if(!fp){
 // Fehlerbehandelung falls Datei nicht geöffnet werden kann
}

// Weiter mit deinen Code

0

#13 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 31. Mai 2010 - 09:03

Zitat

Möchtest du das struct als Datentyp?

ja, das trifft schon das was ich suche.

nochmal als beispiel:

datei_1.c:
#include <stdio.h>

struct test
{
int hallo_wf;
}

void HalloWelt(struct test myStruct)
{
test.hallo_wf = 112;
}


datei_1.h:
#ifndef DATEI_1_H
#define DATEI_1_H

extern struct test;
extern void HalloWelt(struct t);

#endif


So und in der main.c soll nun die struct test bekannt sein.

main.c:
#include <stdio.h>
#include "datei_1.h"

int main(void)
{

struct test testNeu;
return 0;
}


und nun will ich wissen ob ich den struct in der header-datei mit allen werten wieder definieren muss (wie die parameter bei den methoden) und ob das überhaupt mit dem Befehl extern funtkioniert.

Zitat

Also wenn du eine Datei mit r+ öffnest und eine Datei von z.B. 5 Bytes vorzuliegen hast und an die Stelle 10 springst und was in die Datei schreibst, so wird das in der Datei fehlende Stück automatisch mit 0x00 aufgefüllt.

das ist auch sinn der sache :rolleyes:.

Zitat

Noch ein Tipp fürs Datei öffnen:

danke!
aber das if-else konstrukt hier, dient als eine art try-catch ;D.

lg,
Fabi

Dieser Beitrag wurde von Fabi bearbeitet: 31. Mai 2010 - 09:03

0

#14 Mitglied ist offline   basti2k 

  • Gruppe: Mitglieder
  • Beiträge: 2
  • Beigetreten: 31. Mai 10
  • Reputation: 0

geschrieben 31. Mai 2010 - 09:32

Zitat

danke!
aber das if-else konstrukt hier, dient als eine art try-catch


Naja da C kein try-catch kennt (gibt es erst ab C++) macht man es so

Die Funktion fopen gibt bei einen Erfolg einen Zeiger auf eine Struktur vom Typ FILE zurück, beim Misserfolg ist dies ein Null-Pointer, also einfach die Variable auf 0 prüfen.

Kannst ja auch so schreiben, was dann für Anfänger nicht so verwirrend ist:
if(fp == 0){
// Fehlerbehandelung
}

// Normaler Code


Meistens schreibe ich wenn es sich um einer Konsolenanwendung handelt folgendes in den If-Zweig:
if(!fp){
printf("Dateifehler");
exit(1);
}

Dieser Beitrag wurde von basti2k bearbeitet: 31. Mai 2010 - 09:33

0

#15 Mitglied ist offline   Fabi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.958
  • Beigetreten: 30. August 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 31. Mai 2010 - 10:28

also ich mach das ganze so:
if(fp == 0)
{
//Rufe eine Weitere Funktion auf
}
else
{
//Zeige eine Fehlermeldung
}

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0