Napisałem mały program do odszyfrowania zaszyfrowanego pliku OTP. Działa to dobrze.Dlaczego fopen działa bez zapisywania zwróconego wskaźnika?
Ale zdałem sobie sprawę, że zapomniałem zapisać zwrócony wskaźnik pliku podczas wywoływania fopen na "Solution.jpg". Jak widać, piszę do wskaźnika pliku f. Zastanawiam się, dlaczego ten kod działa.
#include <stdio.h>
#define FILE_SIZE 4202
int main() {
unsigned char key[FILE_SIZE], otpCipher[FILE_SIZE];
FILE *f = fopen("otpkey.bin", "r");
fread(key, sizeof(char), FILE_SIZE, f);
fclose(f);
f = fopen("otpcipher.bin", "r");
fread(otpCipher, sizeof(char), FILE_SIZE, f);
fclose(f);
fopen("Solution.jpg", "w");
for (int j = 0; j < FILE_SIZE; ++j) {
otpCipher[j] = otpCipher[j]^key[j];
fputc(otpCipher[j], f);
}
fclose(f);
return 0;
}
'f' jest nieprawidłowe po zamknięciu. Używanie go w dowolnej innej funkcji jest niezdefiniowanym zachowaniem. UB oznacza, że może działać, ale może również ulec awarii, lub napisać do jakiegoś innego pliku lub kontynuować dyskretnie lub dowolną inną niezdefiniowaną akcję. – kaylum
Czy 'fputc (otpCipher [j], f);' pisze do 'Solution.jpg'? Nie sądzę ... – LPs
@LPs Myślę, że tak jest w przypadku OP. Ponieważ 'fopen (" Solution.jpg "," w ");' po prostu używa ponownie tej samej pamięci dla tego 'PLIKU ', ponieważ wskaźnik' f' już wskazuje. Zatem wskaźnik w 'f' używany dla tego' fputc' jest poprawny przez przypadek. – kaylum