对于我的解密程序,我必须能够在最右边的替换表之后,从具有加密文本的文本文件中扫描替换表。我必须使用该替换表来解密消息。所以现在我认为最好的方法是首先扫描替换表并将两个列存储到2个不同的数组中,然后在最后扫描加密的消息。但是,我不知道该怎么做。
我知道无论如何,替换表将不再是62行(26 + 26 + 10)。但是,加密的消息可以包含任意数量的行。
加密文本文件(projectinput.txt)通常如下所示:
a m
b n
etc...
z q
A P
B O
etc...
Z X
0 5
1 4
etc...
9 0
Ekrmov 04320
SDFVSDFV
当前解密代码:
#include <stdio.h>
char input[256];
char encrypted[256];
char line[100];
int c;
int j;
int main(){
FILE *file1=fopen("projectoutput.txt", "r");
FILE *file2=fopen("projectinput.txt", "w");
while(fgets(line,100,file1)!=NULL){
sscanf(line, "%c %c", input, encrypted);
fprintf(file2, "%c %c\n", input[j], encrypted[j]);
}
while((c=fgetc(file1))!=EOF){
int i=0;
while(encrypted[i]!=c){
i++;
}
fputc(input[i], file2);
}
return 0;
}
我刚刚更新了我的代码,我的包含fgets的while循环能够将替换表存储到2个数组中,但是,它也将加密的消息存储在底部。我想停止阅读过去62行的while循环,我应该怎么做?
答案 0 :(得分:2)
for(i = 0; i < 62: i++){
input[i] = fgetc(file1);
fgetc(file1);
encrypted[i] = fgetc(file1);
fgetc(file1);
}
编辑:试试这个
char *buff;
char *decoded;
long file_Size;
fseek(file1, 0, SEEK_END);
file_Size = ftell(file1);
fseek(file1, 0, SEEK_SET);
buff = malloc(file_Size * sizeof(char));
decoded = malloc((file_Size - 62 * 4) * sizeof(char));
//writing all text file to buff array. It is faster and the array is easier to
//manipulate
fread(buff, sizeof(unsigned char), file_Size, file1);
j = 0;
for(i = 0; i < 62; i++){
input[i] = buff[j];
encrypted[i] = buff[j + 2];
j += 4;
}
//move encrypted message to decoded array
memmove(decoded, &buff[62 * 4], file_Size - 62 * 4);
//decoding process
for(i = 0; i < file_Size - 62 * 4; i++){
for(j = 0; j < 62; j++){
if(decoded[i] == '\n' || decoded[i] == ' '){break;}
if(decoded[i] == input[j]){decoded[i] = encrypted[j]; break;}
}
}
将decoded
写入file2和
free(decoded);
free(buff);
瓦尔特
答案 1 :(得分:1)
有两种方法可以做到这一点:
fgets()
。对于每一行,使用空格标记使用strtok
:http://www.cplusplus.com/reference/cstring/strtok/进行拆分,并将每个字符分配给相应的数组。