使用fscanf关闭文件时出错

时间:2016-02-17 16:05:09

标签: c file

我正在使用密码技术VigenèreCipher制作一个加密和解密明文的代码。

加密代码工作正常,但我的解密代码有问题。

要解密:

我用明文密码(编码)读取一个文件并选择一个两位数的十六进制,用我的密钥创建一个XOR,然后它返回给我 原始邮件编码。

问题是我在所有这个过程之后遇到了问题。 该算法效果很好......它解密,但似乎有问题 使用EOF,因为代码在进程后返回错误并且不让我关闭文件。

我们的想法是将密码XOR密钥保存在文件中:

fprintf(fpOut, "%c", ch ^ key[i % KEY_LENGTH]);
  • 明文消息是'Hello!'
  • ctext文件包含'Hello!' XOR键= e94acd43ce0e
  • dtext文件必须再次包含消息Hello(cipher XOR key = message)

我的原始代码(简化)就是这个:

#include <stdio.h>
#include <stdint.h>

#define KEY_LENGTH 2 // Can be anything from 1 to 13

int main ( void ) {

    unsigned char ch;

    FILE *fpIn, *fpOut;
    int i;
    unsigned char key[KEY_LENGTH] = {0xA1, 0x2F};

    fpIn = fopen("ctext.txt", "r");
    fpOut = fopen("dtext.txt", "w");
    i = 0;

    while (fscanf(fpIn, "%02x", &ch) != EOF) {
        printf ("\n Value read: %x", ch);
        if (ch != '\n'){
                ch = ch ^ key[i % KEY_LENGTH];
                i++;
        }
        printf ("\n Value after XOR: %c", ch);
    }

    fclose(fpIn);
    fclose(fpOut);
    return;
}

谁能看到我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果使用<html> <head> <script type='text/javascript'> function addScript() { var newdiv = document.createElement('div'); var p = document.createElement('p'); p.innerHTML = "Dynamically added text"; newdiv.appendChild(p); var script = document.createElement('script'); script.innerHTML = "alert('i am here');"; newdiv.appendChild(script); document.getElementById('target').appendChild(newdiv); } </script> </head> <body> <input type="button" value="add script" onclick="addScript()"/> <div>hello world</div> <div id="target"></div> </body> </html> 选项编译代码,将显示以下消息:

-Wall

错误是传递给test.c: In function ‘main’: test.c:471:5: warning: format ‘%x’ expects argument of type ‘unsigned int *’, but argument 3 has type ‘unsigned char *’ [-Wformat=] while (fscanf(fpIn, "%02x", &ch) != EOF) { ^ 的变量类型。您传递的是char变量的地址,大多数是8位。

scanf将该地址作为scanf指针,并用unsigned int字节写入。

sizeof(unsigned int)变量之后声明的第一个变量是ch。此变量被fpIn覆盖,这就是您无法关闭输入文件的原因:由于指针已损坏。