Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
04.12.09, 14:45
|
#1
|
Anfänger
Registriert seit: Aug 2009
Beiträge: 13
Bedankt: 0
|
c-Quelle - fscanf
Hallo
ich muss ein C-Quelle programmieren. Diese soll auch eine Datei zugreifen, Inhalt auslesen und dann soll es möglich sein weiteren Inhalt in die Datei rein zu schreiben.
Code:
{
char Name[20];
char again='j';
char st;
int semester=0;
FILE *f;
f=fopen("Stud.txt","a+");
if (f!=NULL)
{
fscanf(f,"%s,%s,%i",&Name,&st,semester);
if (!feof(f))
printf("%s %s %i",&Name,&st,semester);
while(!feof(f)||again=='j')
{
printf("Bitte Namen eingeben: ");
scanf("%s",&Name);
printf("Bitte Semesteridentifizierungsbuchstaben eingeben: ");
scanf("%s",&st);
printf("Bitte Semster eingeben: ");
scanf("%i",semester);
fprintf(f,"%s %s %i",Name, st, semester);
printf("Bitte j eingeben fuer weiteren Studenten: ");
scanf("%s",&again);
}
fclose(f);
}
else
{
printf("Fehler!! Datei nicht vorhanden");
}
fscanf(f,Name,st,semester);
return 0;
}
Leider meldet er mir immer wieder ein Speicherproblem und ich weiß nicht woran dies hängt. Hoffe ihr könnt mir helfen und mir sagen wo mein Fehler ist. Danke
Gruß
|
|
|
04.12.09, 17:26
|
#2
|
Anfänger
Registriert seit: Oct 2009
Beiträge: 19
Bedankt: 2
|
Vielleicht sind ja einige Namen größer als dein char Array zulässt.
|
|
|
04.12.09, 17:41
|
#3
|
Lumpi is a Watchdog
Registriert seit: Mar 2009
Beiträge: 14
Bedankt: 5
|
fScanf, prinff
Du übergibst an mehren Stellen printf und fscanf falsche Werte. So steht %s für String und %c für Char.
fscanf(f,"%s,%s,%i",&Name,&st,semester); -> &st ist ein Char also
also -> fscanf(f,"%s,%c,%i",&Name,&st,semester);
Dieses Problem hast du mehrfach auch bei Printf.
fprintf(f,"%s %s %i",Name, st, semester);
also besser fprintf(f,"%s %c %i",Name, st, semester);
Bei Speicherfehlern immer alle fscanf, printf u.s.w prüfen, sind meiner Erfahrung nach fast immer der Grund.
Bei den char Werten kannst du dir den Referenzparameter sparen, da char ein einfacher Datentyp ist und somit immer referenziert wird.
Falls weiter Probs auftreten bitte das Prog. mit Includes und Rahmen zur Verfügung Stellen, damit man es testen kann.
Mfg der Lumpi
|
|
|
06.12.09, 20:19
|
#4
|
Anfänger
Registriert seit: Aug 2009
Beiträge: 13
Bedankt: 0
|
Hallo
Anbei der komplette Code.
Überschrift der Aufgabe ist es der Umgang mit der Dateien zu üben.
Es soll halt eine Datei erstellt werden wenn sie noch nicht erstellt wurde.
Diese Datei soll ausgelesen werde und dann sollen weiter Datensätze folgen.
Studenten Name[20], Studiumsfach mit einem zeichen und das Semester
Code:
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
char Name[20];
char again='j';
char st='n';
int semester=0;
FILE *f;
f=fopen("Stud.txt","a+");
if (f!=NULL)
{
fscanf(f,"%s,%c,%i",&Name,st,semester);
if (!feof(f))
printf("%s %c %i\n",&Name,st,semester);
while(!feof(f)||again=='j')
{
printf("Bitte Namen eingeben: ");
scanf("%s",&Name);
printf("Bitte Semesteridentifizierungsbuchstaben eingeben: ");
scanf("%s",st);
printf("Bitte Semster eingeben: ");
scanf("%i",semester);
fprintf(f,"%s %c %i", Name, st, semester);
printf("Bitte j eingeben fuer weiteren Studenten: ");
scanf("%j",&again);
}
fclose(f);
}
else
{
printf("Fehler!! Datei nicht vorhanden");
}
fscanf(f,Name,st,semester);
return 0;
}
|
|
|
07.12.09, 00:18
|
#5
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
da sind ein paar logische fehler drin. die will ich hier nicht im einzelndem aufdröseln ...
du kennst bestimmt schon funktionen, und wie man solche erstellt und verwendet.
dann erstell' dir funktionen:
FILE* datei_zum_lesen_und_schreiben_oeffnen(char* dateiname)
void datei_ausgeben (FILE* datei)
void daten_einlesen (FILE* datei)
dann sieht main() schonmal so aus:
Code:
FILE* datei_zum_lesen_und_schreiben_oeffnen(char* dateiname) {
return fopen (dateiname, "a+"); /* ist a+ wirklich der gewünschte modus ? kann gut sein, bin mir aber nicht sicher */
}
void datei_ausgeben (FILE* datei) {
...
}
void daten_einlesen (FILE* datei) {
...
}
#define DATEI "Stud.txt"
int main (int av, char** av) {
FILE* f;
f = datei_zum_lesen_und_schreiben_oeffnen (DATEI);
if (f != NULL) {
datei_ausgeben (f);
daten_einlesen (f);
}
else {
printf ("%s ließ sich offentsichtlich nicht erstellen!\n", DATEI);
}
}
vorteil1: du kannst gezielt die einzelnen funktionen testen.
vorteil2: generell bessere übersichtlichkeit im quelltext.
ps: zum mode "a+" :
Zitat:
"a+": 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.
|
probier einfach mal aus, eine nicht leere datei per "a+" zu öffnen und schau dann nach, ob feof(f) erreicht ist. wenn ja, dann must du per rewind erstmal den internal file pointer zurücksetzen bevor du per datei_ausgeben daten einliest ...
viel erfolg!
__________________
entropie erfordert keine wartung
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr.
().
|