我写了一个小程序来解密一个OTP加密的文件。这很好用。
但是我意识到在“Solution.jpg”上调用fopen时我忘了保存返回的文件指针。如您所见,我正在写入文件指针f。我想知道为什么这段代码有效。
#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;
}
答案 0 :(得分:6)
我刚用gdb找到答案。
因为我在打开新文件之前使用fclose()
,所以释放了之前使用的文件的指针。可以再次使用此指针,每次运行此程序时fopen()
都会返回此指针。
所以它的工作原理只是因为在我调用fopen()
时没有打开其他文件。
这是未定义的行为,可能导致其他问题。在任何情况下都应该避免(我错误地做了)。我只想了解为什么这样做并修复了我的代码。