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”作为模式参数,因为此程序也不会从输出文件读取