对于我必须要做的实验,我需要创建一个程序,它将从文本文件中获取一个简单的字符串,并使用一个密钥加密它 - 一个0到255之间的数字。它将文件读入一个通过使用密钥对每个字节进行异或,将此数组加密(或解密)到另一个数组中。最后,它将修改后的数组写入第二个文件。
我大部分都得到了 - 我下面的内容编译得很好。但是,它不会将任何内容复制到第二个文件中。救命啊!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRYPT(a, b) (a ^ b)
int main(int argc, char *argv[])
{
FILE *fp1, *fp2;
int a[100], b, key;
int i = 0;
// opens file containing string to be encrypted
if((fp1 = fopen(argv[2], "rb")) == NULL)
{
printf("Error - could not open file or file does not exist\n");
return;
}
// opens file encrypted string will be saved to
fp2 = fopen(argv[3], "wb");
// converts string to integer
key = atoi(argv[1]);
while(fread(a, sizeof(a), 100, fp1))
{
while (i != '\0');
{
b = CRYPT(a[i], key);
fwrite(&b, sizeof(a), 1, fp2);
i++;
}
}
return 0;
}
答案 0 :(得分:0)
我认为问题出在这里 -
while (i != '\0');
您正在将i
初始化为0,而在while循环中,您正在检查i是否等于NULL
。 NULL
或\0
的整数值为0.因此,表达式为false,并且永远不会执行循环。
同时删除此while
循环末尾的额外分号。
来自reference -
size_t fread(void * ptr,size_t size,size_t count,FILE * stream);
读取 count 元素的数组,每个元素的大小为 size 字节,来自< strong> stream 并将它们存储在 ptr 指定的内存块中。 流的位置指示符按读取的总字节数提前。 成功读取的总字节数是(size * count)。
因此,您还需要将fread
功能更改为此 -
fread(a, sizeof(int), 100, fp1)
同样,您还需要更改fwrite -
fwrite(&b, sizeof(int), 1, fp2);
编辑后的代码看起来应该是这样的 -
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRYPT(a, b) (a ^ b)
int main(int argc, char *argv[])
{
FILE *fp1, *fp2;
int a[100], b, key;
int i = 0;
int data_read = 0;
// opens file containing string to be encrypted
if((fp1 = fopen(argv[2], "rb")) == NULL)
{
printf("Error - could not open file or file does not exist\n");
return;
}
// opens file encrypted string will be saved to
fp2 = fopen(argv[3], "wb");
// converts string to integer
key = atoi(argv[1]);
while( (data_read = fread(a, sizeof(int), 100, fp1)) > 0 )
{
while(i < data_read)
{
b = CRYPT(a[i], key);
fwrite(&b, sizeof(int), 1, fp2);
i++;
}
i=0;
}
return 0;
}
答案 1 :(得分:0)
您的代码存在一些严重缺陷。
首先,整数数组a上有一个缓冲区溢出(即可以将超过100个整数读入a)。
正如托马斯麦卡锡评论你的while循环末尾的分号创建一个空语句 - 删除它。
此外,您正在为每个角色将sizeof(a)或100个整数写入fp2。