c语言中的文件

c语言中的文件,c,file,fgetc,C,File,Fgetc,我需要关于我的代码的帮助,我有一些作品,这是一个作业 假设使用编码/解码方案创建了加密文件 根据如下所示的给定映射,每个字母都被其他字母替换 char * letters = "abcdefghijklmnopqrstuvwxyz"; char * enc = "kngcadsxbvfhjtiumylzqropwe"; 例如,当编码文本时,每个a变为k,当解码时,每个k变为a 您将编写一个程序,对文件进行编码或解码,然后使用上面的映射对文件进行编码或解码 大写字母的映射方式与上面的小写字母

我需要关于我的代码的帮助,我有一些作品,这是一个作业


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

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

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;
}
#包括
#包括
#包括
#包括
int main()
{
字符字母[]={“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz”};
char enlet[]={“kngcadsxbvfhjtiumylzqropweKNGCADSXBVFHJTIUMYLZQROPWE”};
char-infle[20];
字符输出文件[20];
char ch;
int i;
文件*org,*enc,*dec;
printf(“输入文件名(***.txt):”;
获取(填充);
printf(“输入保存文件名(***.txt):”;
获取(输出文件);
org=fopen(填入“r”);
enc=fopen(输出文件,“w+”);
而((ch=fgetc(组织))!=EOF)
{

对于(i=0;i您的if块应为:

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

因此,
ch
不会被替换两次。即,当您知道该输入文件位置的替换时,中断并继续。

您的if块应为:

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

因此,
ch
不会被替换两次。也就是说,当您知道该输入文件位置的替换时,请中断并继续。

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

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

对于该循环中的(i=0;i),在替换ch后覆盖它

while((ch=fgetc(org))!=EOF)
{
    for(i=0;i<52;i++)
    {
        if(letters[i]==ch)
        {
            ch=enlet[i];
        }
    }           
    fputc(ch,enc);
}
while((ch=fgetc(org))!=EOF)
{
对于(i=0;i您可以跳过for()循环,只需使用:

if( org && enc ) 
  while( (ch=fgetc(org))!=EOF)
  {
    char *p = strchr( letters, ch );
    fputc( (p)?enlet[p-letters]:ch, enc );
  }
此外,您确实应该将ch声明为int,以将其与EOF进行比较。get()是一个等待发生的缓冲区溢出并使您的程序崩溃/提供一个安全漏洞挂钩(使用fgets()并记住解析尾随的换行符)。而且您永远不会检查org和enc是否为NULL(文件已成功打开)

您可以跳过for()循环,只需使用:

if( org && enc ) 
  while( (ch=fgetc(org))!=EOF)
  {
    char *p = strchr( letters, ch );
    fputc( (p)?enlet[p-letters]:ch, enc );
  }

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

您做了什么来尝试和调试它?您是否在调试器中运行了该程序?您是否加入了printf debug语句来尝试和理解可能出现的错误?还有,您所说的“代码正在工作”是什么意思?如果它没有做它应该做的事情,那么就不能说它“正在工作”。或者你的意思是它可以处理某些输入,但不能处理其他输入吗?注意:1)使用
char ch;
-->
正确区分从
EOF
读取的所有字符。2)使用
fgets()
而不是
gets()
。3)检查
fopen()的结果
。请始终缩进代码:建议在每个左大括号“{”后缩进4个空格,在每个右大括号“}前取消缩进。这包括每个函数开头和结尾的大括号。文件名长度可以超过19个字符。'gets()'将允许用户溢出输入缓冲区,从而导致未定义的行为,并可能/将导致seg故障事件。'chux'建议使用fgets()输入文件名。这仍然会将文件名限制为19个字符,但会避免缓冲区溢出问题。建议使用'readline()'然后修剪尾随的换行符字符序列以获得文件名。注意:如果在为输出文件调用fopen()时使用fgets(),则还必须修剪“换行符”字符序列,只需使用“w”对于mode参数,因为此程序没有从输出文件中读取。您做了什么来尝试和调试它?您是否在调试器中运行了该程序?您是否将printf debug语句放入以尝试和了解可能出现的错误?此外,“代码正在工作”是什么意思?如果它没有做它应该做的事情,那么就不能说它在“工作”。或者你的意思是它在某些输入上工作,但在其他输入上不工作吗?注意:1)
char-ch;
-->-->
int-ch;
正确区分从
EOF
读取的所有字符。2)使用
fgets()
而不是
gets()
.3)检查
fopen()
的结果。请一致缩进代码:建议在每个左大括号“{”后缩进4个空格,在每个右大括号“}前取消缩进。这包括每个函数开头和结尾的大括号。文件名长度可以超过19个字符。'gets()'将允许用户溢出输入缓冲区,从而导致未定义的行为,并可能/将导致seg故障事件。'chux'建议使用fgets()输入文件名。这仍然会将文件名限制为19个字符,但会避免缓冲区溢出问题。建议使用'readline()'然后修剪尾随的换行符字符序列以获得文件名。注意:如果在为输出文件调用fopen()时使用fgets(),则还必须修剪“换行符”字符序列,只需使用“w”作为模式参数,因为此程序也不会从输出文件读取