提交C编程

时间:2012-05-04 11:49:39

标签: c file scanf

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

修改 https://www.dropbox.com/s/i3afkm439iv3d0v/last%20form.txt这是我添加multply 2和mod 27 for encryption的最后一种形式。它效果更好。但仍然有问题。在txt文件中有“hello world”。加密 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 个答案:

答案 0 :(得分:2)

  

为什么不写下你好世界?

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

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

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

  

但刚刚写完

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

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

要修复它:

  1. 仅打开一次文件。
  2. fprintf中删除空白区域。    fprintf中(垫子, “%C”,字[K]);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

因此,循环的每次迭代都将擦除旧文件内容。

答案 3 :(得分:0)

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

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

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

疯狂循环

我很确定你打算写D[i] = word[i]-'a';,而且你应该使用islower()来测试这个字符是否是小字母字符。

<强> o=D[z]; word[z] = alfabe[o-1];

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