Binärdatei auslesen und vergleichen
-
Guten Tag!
Hat jemand einen Vorschlag für folgendes Problem?
Aus einer Datei(die Strukturen enthält) sollen die Datensätze ausgelesen werden
und nach einer bestimmten Datenstruktur gesucht werden(mittles vergleich).Wurde diese gefunden soll dieser Datensatz durch einen anderen an genau der selben Stelle
ersetzt werden?
Das ganze soll mit fseek fread und ftell geschehen.Da ich diese befehle noch nie angewendet habe erbitte ich eure Hilfe!
viele grüße,
stefan
-
Etwas Eigenleistung bitte... Mit deiner Favorisierten Suchmaschine kannst du dich doch sicher schlau machen und versuchen loszulegen. Dann kommst du nochmal her und zeigst uns wo du stehst und sagst uns, was dein Problem ist.
-
Hier mal eine alte Aufgabe aus meinem Praktikum...
Man musste nach den ID3v2 daten inerhalb einer mp3
File suchen#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include "header.h" struct mp3 { char a_tit[256]; char a_interpret[256]; char a_alb[256]; }Daten[20]; int Laden() { FILE *schreiben, *schreiben2; FILE *mp3File; char stringbuffer[256], Eingabe[5]; int data=0, weiter=0; do { printf("Namen der Mp3-Datei eingeben: "); scanf("%s",stringbuffer); mp3File=fopen(stringbuffer, "rb"); if(!mp3File) { printf("Datei konnte nicht geoeffnet werden."); } //Suche des Titels while(fread(stringbuffer, 4, 1, mp3File)==1) { //Kopfieren von Titel if(strncmp(stringbuffer, "TIT2", 4)==0) { //7-Bytes weiter springen fseek(mp3File, 7, SEEK_CUR); fgets(stringbuffer, 256, mp3File); //Entfernen des TIT2 \0 stringbuffer[strlen(stringbuffer)-4]=0; //Kopieren von stringbuffer in Titel strcpy(Daten[data].a_tit, stringbuffer); break; } else fseek(mp3File, -3, SEEK_CUR); } //Anfang der Datei fseek(mp3File, 0, SEEK_SET); while(fread(stringbuffer, 4, 1, mp3File)==1) { //Suchen nach dem Interpreten if(strncmp(stringbuffer, "TPE1", 4)==0) { fseek(mp3File, 7, SEEK_CUR); fgets(stringbuffer, 256, mp3File); stringbuffer[strlen(stringbuffer)-4]=0; strcpy(Daten[data].a_interpret, stringbuffer); break; } else fseek(mp3File, -3, SEEK_CUR); } fseek(mp3File, 0, SEEK_SET); //Albumsuche while(fread(stringbuffer, 4, 1, mp3File)==1) { if(strncmp(stringbuffer, "TALB", 4)==0) { fseek(mp3File, 7, SEEK_CUR); fgets(stringbuffer, 256, mp3File); stringbuffer[strlen(stringbuffer)-4]=0; strcpy(Daten[data].a_alb, stringbuffer); break; } else fseek(mp3File, -3, SEEK_CUR); } printf("\n----ID3v2 Informationen----\n"); printf("Titel: %s\n", Daten[data].a_tit); printf("Interpret: %s\n", Daten[data].a_interpret); printf("Album: %s", Daten[data].a_alb); printf ("\n\nWeitere Mp3_Datei laden? [JA]/[NEIN]: "); scanf("%s",Eingabe); if ((Eingabe[0]=='N')||(Eingabe[0]=='n')) { weiter=2; } else if ((Eingabe[0]=='J')||(Eingabe[0]=='j')) { weiter=1; data++; } else { printf ("Falsche Eingabe!"); } } while(weiter==1); schreiben2 = fopen("Ini.txt","w+"); fprintf (schreiben2,"%i\n", data+1); fclose(schreiben2); for(weiter=0;weiter<=data;weiter++) { //schreiben in .txt schreiben = fopen("Mp3-Daten.txt","a"); fprintf (schreiben,"\n\n"); fprintf (schreiben,"----ID3v2 Information----\n"); fprintf (schreiben,"Interpret: %s\n", Daten[weiter].a_interpret); fprintf (schreiben,"Titel: %s\n", Daten[weiter].a_tit); fprintf (schreiben,"Album: %s\n", Daten[weiter].a_alb); fclose (schreiben); schreiben2 = fopen("Ini.txt","a"); fprintf (schreiben2,"%s\n", Daten[weiter].a_interpret); fprintf (schreiben2,"%s\n", Daten[weiter].a_tit); fprintf (schreiben2,"%s\n", Daten[weiter].a_alb); fclose(schreiben2); } return 0; }
GL bei deiner Aufgabe, falls du eine präzise Frage stellst,
wird dir sicherlich weitergeholfen
-
EIGENTLICH sind die Aufgaben zum Üben da.
Trotzdem. Du solltest fopen, fread, usw. in www.cpluplus.com eingeben. Sehr zu empfehlen.
-
lk schrieb:
EIGENTLICH sind die Aufgaben zum Üben da.
Ist doch nur ein Beispiel und nicht die Lösung seiner Aufgabe
-
// Wie kann ich folgendes Programm nun abändern damit nicht mehr die nummer des zu ändernden Datensatzes abgefragt wird sondern ein bestimmter Datensatz über einen Vergleich zu einer Struktur findet?
#include <stdio.h>
#define MAXCHAR 32struct artikel_t /* Datentyp der Lagerartikel */
{ int artnr;
char bezeichner[MAXCHAR];
float preis;
int anzahl;
int min;
} ;static int modifyRec (struct artikel_t *sM)
{
printf("Artikel: %03d %-16s %6.2f %4d:%4d\n",
sM->artnr, sM->bezeichner, sM->preis, sM->anzahl, sM->min);
printf ("Korrektur Anzahl %2d nach: ",sM->anzahl);
if (scanf ("%d",&(sM->anzahl)) == 1)
return 1;
else return -1;
}int modifyLager (void)
{ int iRet = 1;
char DateiName[] = "lager.dat";
int rnr, rerg;
long pos;
FILE f_zeig;
struct artikel_t e_1;
if((f_zeig = fopen(DateiName,"r+b")) == NULL)
{ printf("%s kann nicht geoeffnet werden!\n",DateiName);
iRet -1;
}
else
{ do
{ printf("\nGib Rekordnr: ");
scanf("%d",&rnr);
if (rnr >= 0)
{ if (fseek(f_zeig,rnrsizeof(e_1),SEEK_SET) == 0 )
{ pos = ftell(f_zeig);
rerg = fread(&e_1,sizeof(struct artikel_t),1,f_zeig);
if (rerg != 1)
{ printf("Read-Error!!\n"); iRet = -1; }
else if ( modifyRec(&e_1) == 1)
{ fseek(f_zeig,pos,SEEK_SET);
if (fwrite(&e_1,sizeof(struct artikel_t),1,f_zeig) != 1)
{ printf("Write-Error!!\n"); iRet = -1; }
}
}
}
} while (rnr>= 0);
if (fclose(f_zeig)== EOF) iRet = -1;
}
return iRet;
-
folgenden code habe ich zu folgender aufgabe geschrieben:
suche bestimmten Datensatz (preis == 27.12)
ändere diesen Datensatz
und gib diesen aus.MEIN PROBLEM / WO MUSS ICH FSEEK IM CODE POSITIONIEREN????
oder mache ich irgedwas anderes falschstruct artikel_t{
int Artikelnr;
float preis;
}int modify Datensatz (void)
{
int fertig = 0;
long pos;
struct artikel_t Speicherstruct;
FILE * fp;
char binaerdatei[] = "lager.dat";
fp=fopen(binaerdatei,"r+b");
if(fp=NULL)
{ printf("oeffnen ging schief");
exit 1;}
do
{
pos=ftell(fp);
if (fread (&Speicherstruct,sizeof(struct artikel_t),1,fp) != 0)
{ if (struct artikel_t.preis == 27.12)
{ fseek(fp,pos,SEEK_SET);
printf("\n Korrektur Preis %f",struct artikel_t.preis);
scanf(" %f", &(struct artikel_t.preis));
printf("Ausgabe // ausgeben des neuen Strukturelements halt
fseek(fp,pos,SEEK_SET);
if(fwrite(&Speicherstruct,sizeof(struct artikel_t),1,fp) != 1)
printf("write error");
fertig=1;
}
}
else{printf("Nichts in Datei gefunden");
fertig=1;
}
}while(fertig ==0);
fclose(fp)
}
-
Warum verwendest du keine Code-Tags? Sollte doch nicht zu schwer sein?
Beide markierte Stellen würden funktionieren, warum probierst du es nicht selbst aus?
-
vielen dank für die fixe antwort
Was sind den code tags?
und wie würde ich diese hier anwenden?
es dürfte eigentlich auch funktionieren wenn ich fseek an beiden stellen verwende oder?
ich meine dadurch wird mein ergebniss ja nicht verändert oder?
-
Hast du wenigstens mal die Titelzeile des Forums gelesen bevor du hier was fragst? Scheinbar nicht, dort steht:
Bevor du postest lies dir mal "Wohin mit meiner Frage?" durch! Denn hier bitte nur Fragen die Standard C betreffen posten. Wenn du Source Code postest, dann bitte mit Code-Tags [cpp] [/cpp] versehen. Fragen zur Seriellen-Schnittstelle oder ähnliches haben nichts mit C zu tun. Bitte dies in den entsprechenden Foren (Unix, DOS, WinAPI, Rund Um Die Programmierung) posten. Danke