尝试将加密或解密的文件输出到文本文件中

时间:2015-03-01 11:24:38

标签: c encryption

while循环出错了但是我真的不明白为什么。它应该用参数(progname.exe -e input.txt)将文件的加密或解密结果打印到输出文件中

问题是没有使用加密或解密代码创建的输出文件

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int c;
    FILE *fp;
    FILE *output;

    if (argc < 2) {
        exit(EXIT_FAILURE);
    } else if ((fp = fopen(argv[1], "r")) == NULL) {
        exit(EXIT_FAILURE);
    }

    if (strncmp (argv[1], "-d", 2) == 0) {

        output = fopen (argv[5], "w+");

        while (fscanf(fp,"%x",&c) != EOF)  {
            c = c >> 2;
            c = c-200;
            printf("%c", c);
        }
    }

    if (strncmp (argv[1], "-e", 2) == 0) {

        output = fopen (argv[5], "w+");

        while ((c = getc(fp)) != EOF) {
            c = c+200;
            c = c << 2;
            printf("%04x ", c);
        }
    }

    putchar('\n');

    return EXIT_SUCCESS;
}

2 个答案:

答案 0 :(得分:0)

程序参数的顺序/数量似乎没有意义。

程序似乎期望输入文件是第一个参数(argv[1]):

} else if ((fp = fopen(argv[1], "r")) == NULL) {
    exit(EXIT_FAILURE);
}

如果第一个参数不是现有文件,程序将退出而不写任何输出。

稍后将相同的参数与"-d""-e"进行比较以检查解密/加密:

if (strncmp (argv[1], "-d", 2) == 0) {

可能你想在输入文件名argv[2]之后使用程序参数?如果该参数不是-d的{​​{1}},则程序不会写任何输出文件。

此外,第五个参数-e被视为输出文件名。如果这不是有效的文件名,则也不会创建输出文件。

答案 1 :(得分:0)

代码中的问题主要是不正确使用命令行参数。

argc包含参数计数,因此如果您有ls -a -l file,那么argc将包含值4,您可以使用此信息解析内部的命令行参数程序使用switch的情况很容易根据传递的参数数量,或者您可以查看命令行解析器库。

  • getopt()/ getopt_long()(来自POSIX C库的#include <unistd.h>),它可以解决简单的参数解析任务,bash的getopt内置基于Getopt来自GNU libc。
  • Argp (来自GNU C库的#include <argp.h>)。

以下是使用代码的开关案例

的示例

它可以采用命令行参数行。

输出到文件:

prog.exe -e input.txt output.txt
prog.exe -d output.txt input2.txt 

输出到标准输出:

prog.exe -e input.txt
prog.exe -d output.txt

对于其他参数,它将打印一个无效的参数错误并返回。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    int c;
    FILE *input = NULL;
    FILE *output = NULL;
    int encryption = 1;   // Flag to set encryption/decryption.

    switch ( argc ) {
    case 3:
        if ( strchr(argv[1],'-') != NULL ) {
            if ( argv[1][1] == 'e' ) encryption = 1;
            else if ( argv[1][1] == 'd' ) encryption = 0;
            else {
                fprintf(stderr,"Error: invalid Option %s\n",argv[1]);
                exit(EXIT_FAILURE);
            }
            if ((input = fopen( argv[2], "r")) == NULL) {
                fprintf(stderr,"Error: Cannot Open %s\n",argv[2]);
                exit(EXIT_FAILURE);
            }
            output = stdout;
        } else {
            fprintf(stderr,"Error: Invalid arguments\n");
            exit(EXIT_FAILURE);
        }
        break;
    case 4:
        if ( strchr(argv[1],'-') == NULL || 
             strchr(argv[2],'-') != NULL ||
             strchr(argv[3],'-') != NULL ) {
            fprintf(stderr,"Error: invalid argument\n");
            exit(EXIT_FAILURE);
        } else {
            if ( argv[1][1] == 'e' ) encryption = 1;
            else if ( argv[1][1] == 'd' ) encryption = 0;
            else {
                fprintf(stderr,"Error: invalid Option %s\n",argv[1]);
                exit(EXIT_FAILURE);
            }
            if ((input = fopen( argv[2], "r")) == NULL) {
                fprintf(stderr,"Error: Cannot Open %s\n",argv[1]);
                exit(EXIT_FAILURE);
            }
            if ((output = fopen( argv[3], "w+")) == NULL) {
                fprintf(stderr,"Error: Cannot Open %s\n",argv[3]);
                exit(EXIT_FAILURE);
            }
       }
       break;
    default:
        fprintf(stderr,"Error: Invalid arguments\n");
        exit(EXIT_FAILURE);
    }

    // Do encryption and decryption based on the flag.
    if ( encryption ) {
        while ( fscanf(input,"%c",(char*)&c) == 1 ) { // Do encryption
            c = c + 200;
            c = c << 2;
            fprintf(output,"%x ", c);
        }
    } else {
        while ( fscanf(input,"%x ",&c) == 1 )  { // Do decryption
            c = c >> 2;
            c = c - 200;
            fprintf(output,"%c", c);
        }
    }

    return EXIT_SUCCESS;
}