首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

更正: UNIX 文件操作 极限有关问题

2012-03-16 
更正: UNIX文件操作 极限问题./*******************************************用于将文件中XXXXXXX加密的手

更正: UNIX 文件操作 极限问题.
/*******************************************      
       
用于将文件中   XXXXXXX加密的手机号码部分解密出来。

要处理的文件记录格式:   @@XXX   ...   XPPP   ...   Pn   @:空格。n: '\n '。P:为20位的其它内容。
处理后的文件记录格式:XXX   ...   Xn   。
即将两个的前导空格和后20位的其它内容去除,并将号码解密出来,后写回本文件,且覆盖原记录。
执行环境   HP_UNIX   .

file_name:   store_Decipher
creat_date:   20070615          
author:                      
        有些信息需要读配制文件,小弟在此写死了,另见宏定义部分。
小弟遇到的问题是:   1、replace_PhoneNum()   中的   strncpy()   不能取指定的N位。
                                      2、Memory   fault(coredump),不知哪里漏的。
                                      3、若把第一个fseek()注释去则运行则死循环(写回文件时)。
********************************************/


#include   <stdio.h>
#include   <stdlib.h>
#include   <fcntl.h>
#include   <time.h>
#include   <unistd.h>
#include   <dirent.h>
#include   <errno.h>
#include   <sys/stat.h>
#include   <strings.h>
#include   <stdarg.h>


#define   begin_bit               59
#define   sys_Length             344L
#define   KEY                 "DFIOD "
#defineMY_SUCCEED0
#defineMY_FAIL                 1  
#define   PHONE_LENGTH         11


/**********************************************************  
function:   replace_PhoneNum
description:   获取手机号码部分
Input:   Record:   记录
              Systemtype:   计费类型
              sys_length:  
Output:   Record:   记录
Return:   MY_SUCCEED:   成功  
others:
***********************************************************/

int   replace_PhoneNum(   char   *   Record,   long   sys_length   )
{
FILE   *   fp;
int   len;
int   i;
char   fmtBill[   128   ];
char   record_Bill[   512   ];
char   filed_Name[   32   ];
char   Begin_bit[   8   ];
char   Len[   8   ];
char   key[   8   ];
char   record_tmp[   768   ];


strcpy(   key,   KEY   );


for(   i   =   0;   i   <   PHONE_LENGTH;   i++   )
{
Record[   begin_bit   +   2   +   i   ]   =   Record[   begin_bit   +   2   +   i   ]   ^   key[   i   %   strlen(   key   )   ];
}

memset(   record_tmp,   0,   sizeof(   record_tmp   )   );
strcpy(   record_tmp,   Record   );

memset(   Record,   0   ,sizeof(   Record   )   );
strncpy(   Record,   record_tmp   +   2,   (int)   sys_length   );


Record[   sys_length   -   1   ]   =   '\n ';

return   MY_SUCCEED;

}


int   main   (   int   argc,   char   *   argv[]   )
{
FILE   *   fp_Deal;
char   Record[   768   ];
char   Record_init[   768   ];
char   Systemtype[   8   ];
long   sys_Length;
     
if   (   argc   !=   2   )
{
printf(   "文件参数错误,且应为绝对路径。\n "   );
return   ;
}

if(   (   fp_Deal   =   fopen(   argv[   1   ]   ,   "r+ "   )   )   ==   NULL   )        
{
printf(   "文件%s打开失败。\n ",   argv[   1   ]   );            
exit(   1   );                                                                              
}  

memset(   Record,   0,   sizeof(   Record   )   );
memset(   Record_init,   0,   sizeof(   Record_init   )   );

while(   fgets(   Record,   sizeof(   Record   ),   fp_Deal   )   !=   NULL   )
{

if(   replace_PhoneNum(   Record,   sys_Length   )   ==   MY_SUCCEED   )
{
fseek(   fp_Deal,     -sys_Length   -22L,   SEEK_CUR   );                  

if(   fwrite(   Record_init,   (int)   (   sys_Length   +   22L   ),   1   ,   fp_Deal   )   !=   1   )
{
printf(   "写文件出错\n "   );
exit(   1   );
}

      fseek(   fp_Deal,     -sys_Length   -22L,   SEEK_CUR   );
 
    if(   fwrite(   Record,   (int)   (   sys_Length   ),   1,   fp_Deal   )   !=   1   )
    {
    printf(   "写文件出错\n "   );
exit(   1   );
    }

}

    memset(   Record,   0,   sizeof(   Record   )   );
   
}

if(   ferror(   fp_Deal   )   )
{
printf(   "读文件%s失败。\n ",   argv[   1   ]   );

fclose(   fp_Deal   );
exit(   1   );
}

fclose(   fp_Deal   );
printf(   "\n\n执行完毕成功退出...\n\n ");

}


[解决办法]
打开不关?

[解决办法]
说来说去就是一个文件啊, 文件内解密不用这么麻烦, 打开文件, 做个内存映射很容易就操作了.
主要是你已经有了算法, 其他的就是走流程的code问题了.

另外: 楼主的代码风格不敢恭维.

热点排行