Hallo,
Ich habe ein Problem beim Schreiben eines C-Programms, das ich selbst nicht lösen kann.
Es geht darum das ich in einer Binär Datei nach einem String suchen möchte (der warscheinlich mehrmals vorkommt) und ihn jeweils durch Blanks überschreiben will. (Datei und Datei.neu müssen nach dem Vorgang gleich groß sein)
Mein Problem ist das ich zwar weiss wie das mit Textfiles geht, und es da auch schon geschafft habe etwas ähnliches zu tun, aber bei Binärfiles finde ich keine Lösung.
Das Program arbeitet im Moment so:
- Den Dateinamen und den zu suchenden/ersetzenden String bekommt
es über die Eingabeaufforderung (start dateiname string) - Die Datei(.qqt) wird im Binär Mode zum Lesen geöffnet und eine zweite zum schreiben (Datei.qqt.neu) erstellt.
- Danach gibt es momentan noch ein paar ausgaben zu testzwecken
aus (diese stimmen normalerweise immer) - Nun beginnt der eigentliche Suchvorgang
- Die Datei wird Zeilenweise eingelesen
- Die zuletzt eingelesene Zeile wird nach dem String durchsucht
- Wird der String gefunden wird er durch Blanks überschrieben
- Danach wird die bereinigte Zeile in die neue Datei geschrieben
Das Problem ist, das die neue Datei größer ist (da sie Nullen an stellen enthällt an der die original Datei keine enthällt).
Ausserdem sieht es so aus als ob die jeweilige Zeile schon beim Einlesen (bzw. vor dem eigentlichen Suchvorgang) verändert werden würde da der zu suchende string obwohl er im original vorhanden ist nicht gefunden wird und in der neuen Datei mit Nullen bzw. Blanks vorkommt. (ich hab keine ahnung wieso)
Also meine Frage im Prinzip:
Kann mir jemand sagen wie ich das ganze mit Binärfiles am besten mache oder mir sagen wo ich einen Fehler in meinem Programm habe
und wie ich diesen beheben kann ?
Ich bin für jede nützliche Antwort wirklich dankbar,
MfG,
Grand Moobiey
Ich hoffe niemand ist sauer wenn ich meinen Sourcecode zum überprüfen (als Beispiel) anfüge.
Zum testen des Programms bzw. um den Fehler zu sehen könnt ihr im Prinzip jedes beliebige Binärfile benutzen. Zu beachten ist jedoch das das Programm nach der Datei „Dateiname.qqt“ sucht.
Programm aufruf einfach über (Programmname datei string).
#include
#include
#include
int main(int argc, char *argv [])
{
//Erstellen der Variablen
//name wird der String genannt nachdem
//gesucht werden soll
//-------------------------------------
struct stat statbuf;
FILE *file1;
FILE *file2;
char filename[15], *line, *name = argv[2], *result;
int namelenght = strlen(name);
int counter = 0;
int linelenght;
strcpy(filename, argv[1]);
strcpy(name, argv[2]);
//Öffnen der Dateien
//Anzeigen der Benutzten Werte zwecks Überprüfung
//-----------------------------------------------
file1 = fopen(strcat(filename,".qqt"), „rb“);
printf("%s, %s, %d\n", filename, name, namelenght);
stat(filename, &statbuf);
printf(„FSize: %ld\n“, statbuf.st_size);
file2 = fopen(strcat(filename,".neu"), „wb“);
//Länge des zu suchenden Strings
//-------------------------------
namelenght = strlen(name);
//Nochmal ausgeben der Werte
//---------------------------
printf("%s, %s, %d\n", filename, name, namelenght);
if (file1 == NULL)
{
printf(„Fehler beim oeffnen der Datei.\n“);
return 1;
}
/* Datei zeilenweise einlesen und nach
String durchsuchen.
Wenn String gefunden --> durch Blanks ersetzen
und weitersuchen.
Bei Zeilenende mit nächster Zeile
fortfahren ansonsten Program beenden. */
while ((fgets(line, sizeof(line), file1)) != NULL)
{
printf("%s", line);
while((result = strstr(line, name)) != NULL)
{
memset(result, ’ ', namelenght);
// printf("%s", result);
}
linelenght = strlen(line);
printf("%d", linelenght);
fwrite(line, sizeof(line), 1, file2);
//fprintf(file2, „%s“, line);
//if ((strstr(line, „\n“)) == NULL)
// { fprintf(file2, „\n“); }
}
fclose(file1);
fclose(file2);
return 0;
}