2013-11-26 3 views
0

Итак, я пытался написать алгоритм транспонирования, в котором положение каждого символа смещается в новое место в файле. Например, если ключ 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; 
} 
+0

Нет петли для чтения. Вы просто читаете одну строку, «зашифровываете»/«расшифровываете» ее, а затем все готово. Либо читайте строки за строкой в ​​цикле, либо читайте все, используя 'fread'. –

+0

где цикл с условием «EOF»? – yulian

ответ

0

fgets перестает читать, когда он попадает на новую строку.

Вам нужно либо поместить петлю вокруг нее, либо использовать операцию чтения, которая может читать большие куски.

+0

Как вы читаете несколько строк с помощью fgets? Я только что научился использовать его, но я еще не профессионал, я просто новичок. – answerSeeker

+0

'while (! Feof (input)) {fgets (буфер, размер, ввод); ... ' –

+0

Если вы хотите прочитать несколько строк в одной операции чтения, используйте' fread'. –

Смежные вопросы