Hi Leute, bin noch ein ziemlicher Anfänger, was das C programmieren angeht. Mache deshalb z.Zt. einige Übungen und da hänge ich z.Zt. an einem Problem. Also erstmal kompiliert es ohne Fehlermeldung durch, aber nach dem Programmaufruf erhalte ich einen Speicherzugriffsfehler.
Der Zweck des kleinen Übungsprogramms ist es, eine Struktur in einer File zu speichern. Man soll aber auch die Möglichkeit haben, die Daten wieder herauszulesen und darzustellen. Später sollen noch Funktionen folgen, die es möglich machen, den gespeicherten Datensatz zu bearbeiten, das kommt aber noch.
Habe den Code in drei Dateien "datensatz.c", "datensatz.h" und "main.c" (die ersten beiden Dateien sollen quasi universell einsetzbar sein, sodass ich mehrere Programme auf Basis der ersten beiden Dateien machen könnte).
Nun also mein Code sieht folgendermassen aus:
"datensatz.h"
#ifndef DATENSATZ_H_
#define DATENSATZ_H_
struct datensatz
{
char *nachname;
char *vorname;
char *strasse;
char *hausnummer;
char *plz;
char *ort;
char *telefonnummer;
};
int daten_lesen (struct datensatz*, char*);
int daten_schreiben (struct datensatz*, char*);
void daten_ausgeben (struct datensatz*);
void daten_bearbeiten (struct datensatz*); //Die Funktion wird später noch geschrieben, wenn ich das Problem erstmal in den Griff bekommen habe
#endif
"datensatz.c"
#include"datensatz.h"
#include<stdio.h>
int daten_lesen (struct datensatz *ds, char *dateiname)
{
FILE *lesen;
int ausg;
lesen = fopen(dateiname, "r");
if (lesen == NULL){
printf("\nDatei konnte nicht gelesen werden!\n");
ausg = 0;
} else {
printf("\nÖffnen erfolgreich\n");
fgetc(lesen);
fscanf(lesen, "%s", &ds->nachname);
fscanf(lesen, "%s", &ds->vorname);
fscanf(lesen, "%s", &ds->strasse);
fscanf(lesen, "%s", &ds->hausnummer);
fscanf(lesen, "%s", &ds->plz);
fscanf(lesen, "%s", &ds->ort);
fscanf(lesen, "%s", &ds->telefonnummer);
fgetc(lesen);
ausg = 1;
printf("\nDaten erfolgreich eingelesen\n");
fclose(lesen);
};
return ausg;
}
int daten_schreiben (struct datensatz *ds, char *dateiname)
{
FILE *schreiben;
int ausg;
schreiben = fopen(dateiname, "a+");
if (schreiben == NULL){
printf("\nBeim Öffnen oder Erstellen der Datei \"%s\" ist ein Fehler aufgetreten!\n", dateiname);
ausg = 0;
} else {
printf("\nBeginne damit Daten zu schreiben\n");
fprintf(schreiben, "%s\n", ds->nachname);
fprintf(schreiben, "%s\n", ds->vorname);
fprintf(schreiben, "%s\n", ds->strasse);
fprintf(schreiben, "%s\n", ds->hausnummer);
fprintf(schreiben, "%s\n", ds->plz);
fprintf(schreiben, "%s\n", ds->ort);
fprintf(schreiben, "%s\n", ds->telefonnummer);
ausg = 1;
printf("\nDaten erfolgreich geschrieben\n");
fclose(schreiben);
};
return ausg;
}
void daten_ausgeben(struct datensatz *ds)
{
printf("\n%s\n", ds->nachname);
printf("%s\n", ds->vorname);
printf("%s\n", ds->strasse);
printf("%s\n", ds->hausnummer);
printf("%s\n", ds->plz);
printf("%s\n", ds->ort);
printf("%s\n", ds->telefonnummer);
}
#endif
"main.c"
#include<stdio.h>
#include"datensatz.h"
void main()
{
struct datensatz ds1;
ds1.nachname = "Testn";
ds1.vorname = "Testv";
ds1.strasse = "Tests";
ds1.hausnummer = "Testh";
ds1.plz = "Testp";
ds1.ort = "Testo";
ds1.telefonnummer = "Testt";
struct datensatz ds2;
daten_schreiben(&ds1, "test.txt");
daten_lesen(&ds2, "test.txt");
daten_schreiben(&ds2, "test2.txt");
//daten_ausgeben(&ds1);
//printf("\n\nDatensatz 2\n\n");
//printf("%s\n", *ds2.nachname);
//daten_ausgeben(&ds2);
}
Also kompiliert wird mit GCC 4.2.3 unter Linux x86 mit folgenden Kommandos:
gcc -c datensatz.c
gcc -c main.c
gcc -o datensatz datensatz.o main.o
Das daraus folgende Programm "datensatz" dient eigentlich nur dazu, die Funktionen zu überprüfen. Genauso mit den vier "printf" Anweisungen in den Funktionen "daten_lesen(..)" und "daten_schreiben(..)" nur zur Funktionskontrolle dienen.
Als Ausgabe des Programms erhalte ich folgendes:
>./datensatz
Beginne damit Daten zu schreiben
Daten erfolgreich geschrieben
Öffnen erfolgreich
Daten erfolgreich eingelesen
Beginne damit Daten zu schreiben
Daten erfolgreich geschrieben
Speicherzugriffsfehler
Es steht zwar ein zweites mal da, dass das Schreiben der Datei erfolgreich war, doch befindet sich lediglich in der ersten Datei leserlicher Text in der Form:
Testn
Testv
Tests
Testh
Testp
Testo
Testt
Die zweite Datei ist leer.
Nun vermute ich, dass irgendetwas mit der "daten_lesen(..)" Funtkion nicht stimmt, da ja die "daten_schreiben(..)" Funktion beim ersten mal richtig Funktioniert. Also müsste wohl irgendetwas mit den Daten zwischen dem Auslesen aus der Datei und dem Schreiben in der zweiten Datei passieren.
Ich bedanke mich schoneinmal im Voraus. Wäre sehr toll, wenn mit jemand zumindest einen Anhaltspunkt geben könnte.
Falls ihr nochwas wissen müsst, dann fragts einfach
PS: Stimmt die "daten_ausgeben(..)" Funktion eigentlich so? Also, wenn ich die beiden Fnktionen, in denen die zweite "datensatz" Struktur verwendet wird, auskommentiere und stattdessen "daten_ausgeben(&ds1)" stehen lasse, dann kommt eine Ausgabe. Also sollte das doch funktionieren, oder?