1

我正在尝试制作简单的加密算法。我的目标是将 abc(可以是任何单词)翻译为 123。然后应用一些函数然后再次翻译为文本,这是我的算法。我有归档问题。我创建未加密。 txt 写在“hello world”中,然后调试程序它正在创建 encrypted.txt,但只是写了 worl d。为什么它不写 hello world。总是取最后一个单词和空格“worl d”,你能帮帮我吗?

编辑 https://www.dropbox.com/s/i3afkm439iv3d0v/last%20form.txt这是我为加密添加 multply 2 和 mod 27 的最后一种形式。它工作得更好。但仍然有问题。里面有“hello world” txt file.its 加密 pjxxcpjxxcpjxxcpjxxcscixhpjxxcqscixhqpjxxc scixh 但它必须是 pjxxc scixh

   #include <cstdlib>
    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    #include <conio.h>



    int main()
    {   
        int g,p,sak,v,r,t,z,o,c,l,i,j,k,*D;


    char alfabe[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','\0'}; 
     FILE *fp1;
     FILE *mat;
       char word[20];

       fp1 = fopen("unencrypted.txt","r");
       do {
          g = fscanf(fp1,"%s",word); /* dosyadan bir kelime oku... */
          if (g != EOF) {
                mat=fopen("encrypted.txt","w") ;


        c=strlen(word);
        printf("has %d letters ", c);
        D = (int *) malloc( sizeof(int)*c ); 
        for(i=0;i<c;i++) {
            for(j=0;j<26;j++) {
                if(word[i]==alfabe[j]) {  
                     D[i]=(j+1);

                     break;
                }
            }
        }




         printf("\nlast form before translation ");
         for(l=0;l<c;l++) {
           printf("%d",D[l]);  /*it s just for control */

        }
        for(z=0;z<c;z++){

                          o=D[z];
                          word[z]=alfabe[o-1] ;  }   





        printf("\nnew form of word: ");
        for(k=0;k<c;k++) {

           fprintf(mat," %c",word[k]);

        }
    fclose(mat);
    }


    } while (g != EOF);          
       fclose(fp1);   }
4

4 回答 4

2

为什么它不写你好世界?

每次在do-while循环中打开文件:

            mat=fopen("encrypted.txt","w") ;

所以每次内容都会被覆盖。结果,您只会将最后一个单词写入其中。因此,“你好”消失了。

但只是写世界

因为,您在 fprintf 中使用了空格:

   fprintf(mat," %c",word[k]);

要解决这个问题:

  1. 只打开一次文件。
  2. fprintf. fprintf(mat,"%c",word[k]);
于 2012-05-04T11:55:47.747 回答
0

这样做是因为您以“w”写入模式打开文件,因此它会清除以前的内容。尝试以“a+”模式打开它。

于 2012-05-04T11:54:52.740 回答
0

您正在打开文件以在循环内写入:

do {
    ...
    mat=fopen("encrypted.txt","w") ;
    ...
    // writing to file
    ...
    } while(g != EOF);

结果,循环的每次迭代都会清除旧文件内容。

于 2012-05-04T11:56:00.037 回答
0

您正在使用fscanf(...,"%s",...);

现在这是错误的,原因很简单,无论缓冲区有多大,输入总是可以长一个字节。

由于您一次处理一个字符的输入,因此您应该一次读取一个字符。

疯狂的循环

我很确定你的意思是写D[i] = word[i]-'a';,另外你应该通过使用来测试字符是否是小字母字符islower()

o=D[z]; word[z] = alfabe[o-1];

现在这没有多大意义。如果字符是a怎么办?您将访问alfabe[-1].

于 2012-05-04T11:58:55.753 回答