用c语言文件

时间:2015-07-27 20:54:29

标签: c file fgetc

我需要有关我的代码的帮助,我得到了一些作品,这是作业之一。

假设使用编码/解码方案创建了加密文件。

根据给定的映射,每个字母被其他字母替换,如下所示。

char * letters = "abcdefghijklmnopqrstuvwxyz";

char * enc = "kngcadsxbvfhjtiumylzqropwe";

例如,每个a在编码文本时变为k,而每个k在解码时变为a

您将编写程序,编码或解码文件,然后使用上面的映射对文件进行编码或解码。

大写字母的映射方式与上面的小写字母相同,但仍保留大写字母。

例如,每个'A'在编码文件时变为'K',并且每个'K'在解码时变为'A'。

数字和其他字符未编码且保持不变。

编写程序以读取文件并将文件编码为加密文件。 并编写程序以获取加密文件并解码为原始文件。 您的程序应提示用户输入输入文件名和输出文件名。

询问输入文件名/输出文件名(加密文件)。使用上述编码/解码加密。

请求加密文件并解码为原始输入文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
char letters[]={"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
char enlet[]={"kngcadsxbvfhjtiumylzqropweKNGCADSXBVFHJTIUMYLZQROPWE"};
char infile[20];
char outfile[20];
char ch;
int i;

FILE *org, * enc, *dec;

printf("Enter file name (***.txt) : ");
gets(infile);

printf("Enter saving file name (***.txt) : ");
gets(outfile);

org = fopen(infile,"r");
enc = fopen(outfile,"w+");

while((ch=fgetc(org))!=EOF)
{
    for(i=0;i<52;i++)
    {
        if(letters[i]==ch)
        {
            ch=enlet[i];
        }
    }           
    fputc(ch,enc);
}
fclose(org);
fclose(enc);

return 0;
}

此代码正常工作但字母未正确更改。 如果我的原始文件中有“abcdefghijklmnopqrstuvwxyz”, 然后,它在编码文件中发生“felcadlpbrfhjeiqmwleqropwe”。

我预计会是“kngcadsxbvfhjtiumylzqropwe” 我不知道我的代码中有什么错误。

3 个答案:

答案 0 :(得分:4)

您的if块应为:

if ( letters[i]==ch )
{
    ch = enlet[i];
    break;
}

这样ch不会被替换两次。即,您知道替换该输入文件位置,中断并继续前进的那一刻。

答案 1 :(得分:2)

在此循环中,您在替换ch之后覆盖ch。

while((ch=fgetc(org))!=EOF)
{
    for(i=0;i<52;i++)
    {
        if(letters[i]==ch)
        {
            ch=enlet[i];
        }
    }           
    fputc(ch,enc);
}

你可以做以下两件事之一:

  1. 而不是分配ch = enlet [i]而不是做fputch(enlet [i])
    1. 找到匹配后立即打破循环

答案 2 :(得分:0)

您可以跳过for()循环并使用:

\includegraphics[width=0.7\textwidth]{picturesToInc/IMG_7254}

另外,你真的应该将ch声明为int以将其与EOF进行比较。并且gets()是等待发生的缓冲区溢出并使程序崩溃/提供安全漏洞钩子(使用fgets()并记住解析尾随的换行符)。你永远不会检查org和enc是否为NULL(文件打开成功)