Hy alle, Ich habe diesen Code:Duplicate File Zeiger an der gleichen Position
int lenInput;
char input[64], buffer[512], temp[512], *ret, tagName[] = "<name>", tagItem[] = "<item ";
bool deleted = false;
FILE *fp, *fpTemp = NULL;
if(! (fp = fopen(nameFile, "r+"))) {
perror("Error Opening File");
exit(-1);
}
printf("Insert the Name of the service you want to erase... ");
fgets(input, sizeof(input), stdin);
lenInput = (int) strlen(input);
input[lenInput-1] = '\0';
lenInput = (int) strlen(input);
do {
fgets(buffer, sizeof(buffer), fp);
buffer[strlen(buffer)-1] = '\0';
if((ret = strstr(buffer, tagName)) != NULL) {
if(strncmp(ret, tagName, strlen(tagName)) == 0) {
if((ret = strstr(ret, input)) != NULL) {
if(strncmp(ret, input, lenInput) == 0) {
snprintf(temp, sizeof(temp), "<item present=\"false\">\n");
fputs(temp, fpTemp);
deleted = true;
}
}
}
}
else if((ret = strstr(buffer, tagItem)) != NULL) {
if(strncmp(ret, tagItem, strlen(tagItem)) == 0) {
fpTemp = fdopen(dup (fileno(fp)), "r+"); /* associates a stream with the existing file descriptor, fd */
}
}
} while((deleted != true) && (!(feof(fp))));
if(deleted == false)
printf("Error: Service Not Found!\n");
else
printf("Success: Service Erased!\n");
und es würde so an einer Datei arbeiten:
<serviceNumber>2</serviceNumber>
<item present="true">
<id>1</id>
<name>name1</name>
<description>descr1</description>
<x>1</x>
<y>1</y>
</item>
<item present="true">
<id>2</id>
<name>name2</name>
<description>descr2</description>
<x>2</x>
<y>2</y>
</item>
Der Hauptdateizeiger (FILE *fp
) ist in der main()
.
Meine Idee ist, den Dateizeiger fp
(der im Prototyp übergeben wird) zu duplizieren, wenn ich das Tag <item ...>
finde, weil, wenn dieses Tag mit dem Namen des Dienstes verknüpft ist, den ich löschen möchte, ich ' Um die gesamte <item ...>
Zeichenfolge zu ersetzen.
Aber ich habe ein Problem ... wenn ich snprintf()
und fputs()
ausführen, wird die Datei am Anfang der Datei überschrieben, weil, ich denke, der Dateizeiger ist nicht doppelt gut.
Es gibt einen Weg oder eine Problemumgehung, um dieses Problem zu beheben/zu beheben?
Vielen Dank im Voraus!
Was "duplizieren"? Das einzige, was wir in Ihrem Code sehen können, ist 'fpTemp', das offensichtlich eine lokale Variable ist. Du rufst 'fopen' nirgends an. Niemand kann die Frage nur mit diesem Code beantworten. Siehe auch [warum ist während (! Feof (fp)) immer falsch] (http://stackoverflow.com/questions/5431941/why-is-which-feof-file-always-wrong). – Lundin
Verwenden Sie POSIX 'dup()' nicht mit der ANSI 'FILE *'. – jdarthenay
@Lundin Ich habe den Beitrag bearbeitet ... Ich habe das 'fopen' hinzugefügt. –