读书人

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

发布时间: 2012-03-16 16:34:56 作者: rapoo

更正: 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问题了.

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

读书人网 >UNIXLINUX

热点推荐