CRLF in einer Textdatei Möglich?
-
Die Strukturen sind richtig gefüllt.
Meine Struktur, welche abgespeichert werden soll:
struct Biathlon { char vName[20]; char nName[20]; int GebJahr; char Land[20]; int Nummer; //1-15 int LaufZeitMin; int LaufzeitSec; int Fehl; //Fehlschüsse beim Schiessen, maximal 15 int rennen; }temp,Teilnehmer[16];
Füllung:
Die werte vName,nName,GebJahr,Land werden hierdurch definiert:fseek(pfile,((zahlen[i]-1)*sizeof(Biathlon)),SEEK_SET); fread(&Teilnehmer[i],sizeof(Biathlon),1,pfile);
Hier kann es kein Problem geben, da ich diese werte mittels Programm schon vorher ausgeben kann. Dies funktioniert ohne Probleme.
Die werte rennen und Nummer werden dann in abhängigkeit des aktuellen rennens und einer forschleife (variable i) bestimmt:
Teilnehmer[i].rennen=rennWelch; Teilnehmer[i].Nummer=i+1;
Die zeiten werden und Fehlschuesse werden hier gefüllt:
gotoxy(1,20); printf("Eingabe der Laufzeit:"); gotoxy(45,20); setcolor(192); printf("mm"); gotoxy(45,20); scanf("%d",&Teilnehmer[temp].LaufZeitMin); setcolor(15); gotoxy(45,20); printf("%d ",Teilnehmer[temp].LaufZeitMin); do { gotoxy(55,20); setcolor(192); printf("ss"); gotoxy(55,20); scanf("%d",&Teilnehmer[temp].LaufzeitSec); setcolor(15); gotoxy(55,20); printf("%d ",Teilnehmer[temp].LaufzeitSec); if(Teilnehmer[temp].LaufzeitSec>60) { gotoxy(1,23); setcolor(12); printf("Eine Minute hat nur 60 Sekunden!"); gotoxy(1,24); printf("Eingabe bitte wiederholen!"); setcolor(15); //Anweisungen zum Löschen der Fehlermeldung _sleep(1000); gotoxy(1,23); printf(" "); gotoxy(1,24); printf(" "); } }while(Teilnehmer[temp].LaufzeitSec>60); gotoxy(1,22); printf("Eingabe der Fehlschuesse:"); do { gotoxy(40,22); setcolor(192); printf(" xx "); gotoxy(41,22); scanf("%d",&Teilnehmer[temp].Fehl); if(Teilnehmer[temp].Fehl>15) { gotoxy(1,23); setcolor(12); printf("Fehleranzahl unwahrscheinlich, bei nur 15 abzugebenen Schuessen!"); gotoxy(1,24); printf("Eingabe bitte wiederholen!"); setcolor(15); //Anweisungen zum Löschen der Fehlermeldung _sleep(1000); gotoxy(1,23); printf(" "); gotoxy(1,24); printf(" "); } }while(Teilnehmer[temp].Fehl>15); setcolor(15); gotoxy(40,22);
Gespeichert wird es mit dieser Funktion:
void SicherRennen()
{
int i; //Indexvariable
FILE *sfile;
sfile=fopen("C:\\temp\\RennDaten.dat","a");
for(i=0;i<15;i++)
{
fseek(sfile,0,SEEK_END);
fwrite(&Teilnehmer[i],sizeof(Biathlon),1,sfile);}
fclose(sfile);
}Durch Hilfs ausgaben habe ich auch gesehen,dass die Strukturen gefüllt sind.
Die auslesung erfolgt dann durch diese Funktion:
for(j=0;j<k;j++) { fseek(sfile,(zwspeicher+j)*sizeof(Biathlon),SEEK_SET); fread(&temp,sizeof(Biathlon),1,sfile); gotoxy(1,(3+j)); printf("%d",temp.rennen); gotoxy(8,(3+j)); printf("%d",temp.Nummer); gotoxy(16,(3+j)); printf("%s",temp.vName); gotoxy(31,(3+j)); printf("%s",temp.nName); gotoxy(46,(3+j)); printf("%d",temp.GebJahr); gotoxy(54,(3+j)); printf("%s",temp.Land); gotoxy(66,(3+j)); printf("%d.%d",temp.LaufZeitMin,temp.LaufzeitSec); gotoxy(73,(3+j)); printf("%d",temp.Fehl); }
Zu deiner letzten Frage:
Naja eine beliebige Anzahl von strukturen werden richtig ausgegeben (meistens so um die 5-10). Der Rest von den noch auszugebenen Strukturen (sollen insgesamt 15 sein) wird durch irgendwelche Werte meist Zahlen ausgefüllt. Es kommt mir vor, wie wenn er die Werte nicht mehr korrekt lesen kann udn füllt sie dann mit irgendwelchen.Vergleichbar mit der ausgabe einer uninitialisierten variable:
Wie hier:
void main()
{
int i;
printf("%d",i);
}Ich hoffe du kommst mit den Bruchstücken klar
-
Lyrix schrieb:
Das problem ist, wenn ich es einlese, liest er nur die ersten 10 Strukturen richtig ein, den Rest sieht er als undefiniert an. Ein bekannter meinte evt koennte ich damit das Problem loesen.
Was genau meinst Du mit undefiniert?
Wenn ich Dich richtig verstanden habe, dann soll das als Editor-lesbare Textdatei abgespeichert werden, deswegen dann auch das CRLF?
Das kann man auch so lösen, daß Du z.B.:
struct Biathlon { char vName[20]; char nName[20]; int GebJahr; char Land[20]; int Nummer; //1-15 int LaufZeitMin; int LaufzeitSec; int Fehl; //Fehlschüsse beim Schiessen, maximal 15 int rennen; char c='/n'; // Newline }temp,Teilnehmer[16];
Es sollte außerdem möglich sein, das komplette Array auf einen Rutsch zu schreiben / zu lesen.
Ich habe das jetzt zwar nicht getestet, aber mit
fwrite(Teilnehmer,sizeof(Biathlon)*16,1,sfile);
oder
fwrite(Teilnehmer,sizeof(Biathlon),16,sfile);
sollte das möglich sein.
-
Was genau meinst Du mit undefiniert?
Wenn ich Dich richtig verstanden habe, dann soll das als Editor-lesbare Textdatei abgespeichert werden, deswegen dann auch das CRLF?
-->
Naja eine beliebige Anzahl von strukturen werden richtig ausgegeben (meistens so um die 5-10). Der Rest von den noch auszugebenen Strukturen (sollen insgesamt 15 sein) wird durch irgendwelche Werte meist Zahlen ausgefüllt. Es kommt mir vor, wie wenn er die Werte nicht mehr korrekt lesen kann udn füllt sie dann mit irgendwelchen.
Vergleichbar mit der ausgabe einer uninitialisierten variable:
Wie hier:
void main()
{
int i;
printf("%d",i);
}char c='/n'; // Newline
Kompilerfehler:
Ungültige Syntax
-
Ersetze das
char c='/n'; // Newline
durch
char c='\n';Ich frags nochmal hast du alle sprich 15 Teilnehmer auch in das file eingetragen.
was macht zwspeicher
Schreib mal in eine neue Datei 15 Teilnehmer und nenn deren Namen Teil_0, Teil_1,...., Teil_15
Dann lies die Datei und überprüfe ob sie in derselben Reihenfolge beginnend mit Teil_0 ausgegeben werden
und wenn bei welchem Teilnehmer du scheiterst.Deine Methoden die Dateien sind zwar korrekt aber etwas gewöhnungsbedürftig.
Nach einem fopen "rb stehst du am Anfang der Datei und kannst entweder in einer Scheleife mit 15 reads die Daten
lsen oder ein feld von Strukturen (mit 15 Elementen) mit einem Fread füllen, du brauchst nicht für jed3n record einzeln zu positionieren.Meine Meinung zu linearem Code kennst du ja inzwischen
-
PAD schrieb:
Ersetze das
char c='/n'; // Newline
durch
char c='\n';vertippt ...
-
@devas was soll diese newline bringen.
Außerdem weigert sich ein C-Compiler normalerweise in der Strukturdefinition eine initialisierung vorzunehmen, es
kann sein das eine C++-Compiler das akzeptiertSchau mal hier wie Daten binaer gespeichert werden, du kannst damit keine Synchronisation erzwingen
http://www.c-plusplus.net/forum/viewtopic-var-t-is-114241-and-highlight-is-.html
-
char c='\n'
acuh so geht es nicht.
Fehlermeldung:
Nur Funktionen können virtuell deklariert werden.
Ungültige Syntax!@PAD
Ja hab alle 15 Teilnehmer eingetragen@linearem Code:
Ich werde mir angewöhnen zukünftig meinen Code besser zu strukturieren. Merke es ja nun selbst, dass ich totale Schwierigkeiten habe *g*
Aber wie sagt man so schoen, aus Fehlern lernt man._edit_
Koennte es daran liegen, dass ich beim ersten abspeichern in die tct Datei Teilnehmer zwar die ganze Struktur abspeichere aber nur die ersten 4 werte sind belegt.
zwar gibt ers richtig aus, aber koennte doch sein, dass er dann beim initialisieren der anderen werte einen fehler macht?
-
Hast du den von mir beschreibenen Versuch schon gemacht. Ich hoffe durch das Ergrebnis auf die Fehlerart schlißen zu können
Schreib mal in eine neue Datei 15 Teilnehmer und nenn deren Namen Teil_0, Teil_1,...., Teil_15
Dann lies die Datei und überprüfe ob sie in derselben Reihenfolge beginnend mit Teil_0 ausgegeben werden
und wenn bei welchem Teilnehmer du scheiterst.
-
Ok:
Ich habe das mal in meinem Programm gemacht. (Textdateien davor erneuernlassen)
Zunächst lass ich ja wie schon erwähnt, Name, Vorname, GebJahr und Land eingeben und abspeichern.
Dann wieder auslesen und ausgeben.
Bis hier her läuft alles Fehlerfrei!Nun, fülle ich in der Struktur jeweils noch die anderen Variablen aus, lass es abspeichern, wieder einlesen und alle werte ausgeben.
Bis teilnehmer9 macht er das einwandfrei. Dann scheitert er und es wird nichts mehr korrekt am bildschirm ausgegeben.
-
PAD schrieb:
@devas was soll diese newline bringen.
Außerdem weigert sich ein C-Compiler normalerweise in der Strukturdefinition eine initialisierung vorzunehmen, es
kann sein das eine C++-Compiler das akzeptiertSchau mal hier wie Daten binaer gespeichert werden, du kannst damit keine Synchronisation erzwingen
http://www.c-plusplus.net/forum/viewtopic-var-t-is-114241-and-highlight-is-.htmlSynchronisation? Dann muß ich irgendetwas falsch verstanden haben. Ich dachte es geht um das richtige schreiben und lesen der Daten ?
Wozu ein Newline? Na, wenn ich die Strukturen schreibe (ob am Stück, oder in einem Rutsch), sorgt das newline für eben dieses - eine neue Zeile, so daß ich die Datei an einem bel. Editor halbwegs formatiert lesen kann. Wenn ich dieses sowieso brauche, damm kann ich das doch eigentlich auch gleich in die Struktur einbauen. (P.S. mit der Initialisierung hast Du natürlich recht - da habe ich nicht aufgepasst.)
-
d.h das Eintragen der zusätzlichen Daten macht das Problem
Frage welche Daten tägst du zusätzlich ein und was sind das für Datentypen
-
Alle mit << makierten
struct Biathlon
{
char vName[20];
char nName[20];
int GebJahr;
char Land[20];
int Nummer; //1-15 <<
int LaufZeitMin; <<
int LaufzeitSec;<<
int Fehl; //Fehlschüsse beim Schiessen, maximal 15 <<
int rennen; <<
}temp,Teilnehmer[16];
-
@devas. du hättest recht wenn nicht beim schreiben von strukturen die füllbytes mitgeschreiben werden. diese machen deine Methode leider kaputt. deswegen ausch der hinweis auf den anderen thread, da habe ich es hoffentlich richtig erklärt. Das störende hier ist, das der wert der Füllbytes nicht bekannt ist und beim abspeichern von int, float und den anderen einfachen typen jeder binaerwert innerhalb eines Bytes zulässig ist somit auch das \n. DAmit kann es an belibiger Stelle auftauchen und macht deine Idee leider kaputt
-
Schade ich dachte da wär mindestens ein string dabei, dann hätte ich vermutet das du das Ende überschreibst.
Frage bis wann brauchst du das Programm?
Wenn es nicht bis morgen ist kannst du, wenn du es willst, es mir über das Forum per email zusenden, ich schaus mir dann an.
An diese Mail komme ich aber erst morgen.
Dazu Gehe in diesem meinem Beitrag im Feld Autor auf Benutzerprofil dann dort
auf E-Mail-Adresse: E-Mail senden#Packe in das Fenster deinen completten Code und datedateien
-
Ich brauch es bis morgen.
Doch durch einen Zufall habe ich den Fehler nun gefunden. Der Kompiler kam scheinbar nicht damit klar, dass ich das fseek in eienr for Schleife hatte.
Nun hab ich das fseek mal raus, weil du ja gesagt hast, dass ich das ncih inne schleife tun brauch, und schon war der Fehler behoben.*ein riesen Stein vom Herzen fällt*
Also noch mal an alle einen riesen Dank, die mir hier geholfen haben. Und nen noch Grösseren Dank an dir PAD für die nervenden Hilfs-Stunden eben mit mir.
Vlt lese ich ja mal nen Beitrag wo ich euch helfen kann *g*
Drueckt mir die Daumen dass nen Einser rauskommt, den ich brauche
MFG
Lyrix
-
@Wenn´s mal nur am Wissen und Erfahrung und nicht am wollen fehlt, hilft mal gerne.
Und mit dem rückzahlen, wir nehmen dich beim Wort
-
PAD schrieb:
@devas. du hättest recht wenn nicht beim schreiben von strukturen die füllbytes mitgeschreiben werden. diese machen deine Methode leider kaputt. deswegen ausch der hinweis auf den anderen thread, da habe ich es hoffentlich richtig erklärt. Das störende hier ist, das der wert der Füllbytes nicht bekannt ist und beim abspeichern von int, float und den anderen einfachen typen jeder binaerwert innerhalb eines Bytes zulässig ist somit auch das \n. DAmit kann es an belibiger Stelle auftauchen und macht deine Idee leider kaputt
Ok - *zieht den virtuellen Hut*
Ich schreibe normalerweise nur Daten, die ich nicht als Textfile brauche.
-
Ich versuche Daten soweit es sinnvoll ist, eigentlich immer als ASCII zu schreiben.
Auf binär Formate wechsle ich nur wenn sie mir Platz und/oder Performance Probleme beheben,
oder um Kunden davon abzuhalten die Daten (da reicht dann oftmals ein xor um die Daten zu verschleiern) zu verändern.Ich habe oft genug erlebt, "Ich habe mir nur das autoexec.bat angeschaut"
Womit?
Mit Word
noch fragen?Im Normalfall kann man ascii daten leichter an geänderte Kundenwünsche anpassen als binärdaten.
MfG PAD
-
Hi,
ich wollte euch nur sagen, dass ich in diesem Projekt ne eins bekommen habe mit 114 von 120 Punkten. Vielleicht interessiert es ja jemanden
Danke nochmal an alle Helfenden...