c语言 关于文件加密解密问题

puhjack 2009-03-09 03:35:51
/* Program: Coder.c
* Usege: Coder [filename] [action]
* where filename = filename for/with coded data
* where action = D for decode anything else for
* coding
*-------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int encode_character( int ch, int val );
int decode_character( int ch, int val );

int main( int argc, char *argv[] )
{
FILE *fh; /* file handle */
int rv = 1; /* return value */
int ch = 0; /* variable to hold a character */
unsigned int ctr = 0; /* counter */
int val = 5; /* value to code with */
char buffer[257]; /* buffer */

if( argc != 3 )
{
printf( " \nError: Wrong number of parameters..." );
printf( "\n\nUsage:\n %s filename action", argv[0] );
printf( "\n\n Where:" );
printf( "\n filname = name of file to code or decode" );
printf( "\n action = D for decode or c for encode\n\n" );
rv = -1; /* set return error value */
}

else
if(( argv[2][0] == 'D' ) || ( argv[2][0] == 'd' )) /* to decode */
{
fh = fopen( argv[1], "r" ); /* open the file */
if( fh <= 0 ) /* check for error*/
{
printf( "\n\nError opening file..." );
rv = -2; /* set return error value */
}

else
{
ch = getc( fh ); /* get a character */
while( !feof( fh ) ) /* check for end of file */
{
ch = decode_character( ch, val );
putchar( ch ); /* write the character to screen */
ch = getc( fh );
}
fclose( fh );
printf( "\n\nFile decoded to screen.\n" );
}
}
else /*assume coding to file. */
{
fh = fopen( argv[1], "w" );
if( fh <= 0 )
{
printf( "\n\nError creating file..." );
rv = -3; /* set return value */
}

else
{
printf( "\n\nEnter text to be coded. " );
printf( "Enter a blank line to end.\n\n" );

while( gets(buffer) != NULL )
{
if( buffer[0] == 0 )
break;

for( ctr = 0; ctr < strlen(buffer); ctr++ )
{
ch = encode_character( buffer[ctr], val );
ch = fputc( ch, fh ); /* write the character to file */
}
}

printf( "\n\nFile encoded to file.\n" );
fclose( fh );
}

}

system( "pause" );
return (rv);
}


int encode_character( int ch, int val )
{
ch = ch + val;
return (ch);
}


int decode_character( int ch, int val )
{
ch = ch - val;
return (ch);
}


代码可以运行成功,但是出现一个问题,好像只能执行第一个if语句。调试却没有找出原因,请朋友指点
声明(本人用dev编译器 编译于桌面的一个文件夹里(文件夹是中文)编译运行后显示的路径是桌面....不知道这个与错误有没有关系)


if(( argv[2][0] == 'D' ) || ( argv[2][0] == 'd' )) 还有这条代码设计的功能是解码 。 我主要是没有理解 argv[2][0] 怎么作为多维数组使用了?或者说能帮提示我理解的方法。

int main( int argc, char *argv[] ) 基本上就没用过,理解的层面很浅 只是知道 int argv 是参数个数 char *argv[] 是取参数。 也希望大家能帮给我点详细的提示什么的。
先谢过大家了
...全文
345 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
puhjack 2009-03-10
  • 打赏
  • 举报
回复
主要问题没有回答啊?
麻烦帮忙看看
puhjack 2009-03-10
  • 打赏
  • 举报
回复
/* Program: Coder.c
* Usege: Coder [filename] [action]
* where filename = filename for/with coded data
* where action = D for decode anything else for
* coding
*-------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int encode_character( int ch, int val );
int decode_character( int ch, int val );
int tmain( int argc, char *argv[] );

int main( void )
{
int argc,i;
int result;
char argv[3][20];
char *p[3];

argc=3;
//argv[2][0]='D';
argv[2][0]='e';

for(i=0;i<3;i++)
p[i]=argv[i];

printf("Input file name:\n");
scanf("%s",p[1]);

result=tmain(argc,p);
}

int tmain( int argc, char *argv[] )
{
FILE *fh; /* file handle */
int rv = 1; /* return value */
int ch = 0; /* variable to hold a character */
unsigned int ctr = 0; /* counter */
int val = 5; /* value to code with */
char buffer[257]; /* buffer */
int slen; /*buffer中字符串的长度*/

if( argc != 3 )
{
printf( " \nError: Wrong number of parameters..." ); // parameters 参数
printf( "\n\nUsage:\n %s filename action", argv[0] );
printf( "\n\n Where:" );
printf( "\n filname = name of file to code or decode" );
printf( "\n action = D for decode or c for encode\n\n" );
rv = -1; /* set return error value */
}

else
if(( argv[2][0] == 'D' ) || ( argv[2][0] == 'd' )) /* to decode */
{
fh = fopen( argv[1], "r" ); /* open the file */

if( fh <= 0 ) /* check for error*/
{
printf( "\n\nError opening file..." );
rv = -2; /* set return error value */
}

else
{
ch = getc( fh ); /* get a character */
while( !feof( fh ) ) /* check for end of file */
{
ch = decode_character( ch, val );
putchar( ch ); /* write the character to screen */
ch = getc( fh );
}
fclose( fh );
printf( "\n\nFile decoded to screen.\n" );
}
}
else /*assume coding to file. */
{
fh = fopen( argv[1], "w" );
if( fh <= 0 )
{
printf( "\n\nError creating file..." );
rv = -3; /* set return value */
}

else
{
printf( "\n\nEnter text to be coded. " );
printf( "Enter a blank line to end.\n\n" );

scanf("%s",buffer);
slen=strlen(buffer);

for( ctr = 0; ctr < slen; ctr++ )
{
ch = encode_character( buffer[ctr], val );
ch = fputc( ch, fh ); /* write the character to file */
}

//while( gets(buffer) != NULL )
//{
// if( buffer[0] == 0 )
// break;

// for( ctr = 0; ctr < strlen(buffer); ctr++ )
// {
// ch = encode_character( buffer[ctr], val );
// ch = fputc( ch, fh ); /* write the character to file */
// }
//}

printf( "\n\nFile encoded to file.\n" );
fclose( fh );
}

}

system( "pause" );
return (rv);
}


int encode_character( int ch, int val )
{
ch = ch + val;
return (ch);
}


int decode_character( int ch, int val )
{
ch = ch - val;
return (ch);
}


被修改后可以使用的代码奉上,大家一起讨论吧。
zhoujielun19977991 2009-03-10
  • 打赏
  • 举报
回复

代码可以运行成功,但是出现一个问题,好像只能执行第一个if语句。调试却没有找出原因,请朋友指点
声明(本人用dev编译器 编译于桌面的一个文件夹里(文件夹是中文)编译运行后显示的路径是桌面....不知道这个与错误有没有关系)

if(( argv[2][0] == 'D' ) || ( argv[2][0] == 'd' )) 还有这条代码设计的功能是解码 。 我主要是没有理解 argv[2][0] 怎么作为多维数组使用了?或者说能帮提示我理解的方法。

int main( int argc, char *argv[] ) 基本上就没用过,理解的层面很浅 只是知道 int argv 是参数个数 char *argv[] 是取参数。 也希望大家能帮给我点详细的提示什么的。
先谢过大家了


程序没有问题,运行方式不是这样的,你可以在建一个文件夹“q.txt”,然后在运行cmd.exe,然后在你源文件所在盘符下(在你这就是桌面所在的盘)依次输入3个字符串变量:1.输入argv【0】所存的字符串(在你这就是可执行文件的路径),2.文件名“q.txt”,3.是D|d|其他字母,如果是D|d,就是就执行从q.txt读出操作,如果是其他字母就执行写入q.txt
例如:E:\>DEV\project\Untitled1.exe q.txt u 三个参数之间有空格,LZ可以试一下。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luobinshan 的回复:]
argv 是一个 指针 数组, argc=数组长度

如执行命令 ./main abcde f
argc=3,
argv[0]指向 ./main
argv[1]指向 abcde
argv[2]指向 f

将argv[1]整体看作一个 字符串指针 .
[/Quote]
恩,1楼讲得很清楚。
luobinshan 2009-03-09
  • 打赏
  • 举报
回复
argv 是一个 指针 数组, argc=数组长度

如执行命令 ./main abcde f
argc=3,
argv[0]指向 ./main
argv[1]指向 abcde
argv[2]指向 f

将argv[1]整体看作一个 字符串指针 .

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧