Итак, я пытался написать алгоритм транспонирования, в котором положение каждого символа смещается в новое место в файле. Например, если ключ 3 и массив символов являетсяКак заставить этот транспозиционный алгоритм читать целый текстовый файл
"This program is supposed to encrypt a file."
после шифрования, на выходе будет
"Tsrr ps cpai.h oaispetert lipgmsuodony fe"
Проблемы в том, что после того, как это делается шифрование первой строки файла, он останавливается и не продолжает шифровать весь файл. после компиляции, он может быть выполнен следующим образом:
./executable -e 3 inputfile outputfile
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 200
int main (int argc, char* argv[ ]) {
int pos = 0;
char characters[ BUFFER_SIZE ];
int index, k, size, key;
char* echars;
FILE* input;
FILE* output;
if (argc == 5) {
// exits if key is lower than 1
key = atoi (argv[ 2 ]);
if (key < 1) {
perror ("Error: This value cannot be used as a key");
exit (EXIT_FAILURE);
}
input = fopen (argv[ 3 ], "r");
//Shows error if there's no file
if (input == NULL) {
perror ("Error, File doesn't exits");
exit (EXIT_FAILURE);
}
output = fopen (argv[ 4 ], "w");
fgets (characters, BUFFER_SIZE, input);
fseek (input, 0, SEEK_END);
size = ftell (input);
echars = (char*) malloc (size);
if (strcmp (argv[ 1 ], "-e") == 0) {
while (strlen(characters) && characters[strlen(characters)-1] == '\n'){
characters[strlen(characters)-1] = '\0';
for (index = 0; index < key; index++) {
for (k = index; k < strlen(characters); k += key)
echars[ pos++ ] = characters[ k ];
}
printf("Successfuly encrypted\n");
}
} else if(strcmp (argv[ 1 ], "-d") == 0) {
for (index = 0; index < key; index++) {
for (k = index; k < strlen(characters); k += key)
echars[ k ] = characters[ pos++ ];
}
printf("Successfuly decrypted\n");
}
fputs(echars, output);
fclose (input);
fclose (output);
} else {
perror("Too few arguments, something went wrong\n");
printf("Usage: ./program -e (encrypts) or -d (decripts) 3 (key) inputfile destinationfile\n");
printf("Example:'./exectutable -e 3 inputfile.txt outputfile.txt\n");
exit (EXIT_FAILURE);
}
return 0;
}
Нет петли для чтения. Вы просто читаете одну строку, «зашифровываете»/«расшифровываете» ее, а затем все готово. Либо читайте строки за строкой в цикле, либо читайте все, используя 'fread'. –
где цикл с условием «EOF»? – yulian