首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言读写文件的有关问题,疑惑中

2012-02-27 
C语言读写文件的问题,疑惑中C/C++ code#include stdio.h#include math.h/** int2bin** 将一个unsigned

C语言读写文件的问题,疑惑中

C/C++ code
#include <stdio.h>#include <math.h>/** int2bin** 将一个unsigned char类型的整数(0~255)转化为一个二进制数组** @param unsigned char intValue 要转化的整数* @param int *binArray 指向二进制数组的指针* @param int n 要转化成的二进制数组的元素个数 * @return void*/void int2bin(unsigned char intValue,unsigned char *binArray,int n) {    unsigned char divValue;    unsigned char modValue;    int index = n-1;    //binArray = (char *)malloc(sizeof(char)*8);//函数内部不能申请初址    //binArray[8] = {};    divValue = intValue/2;    modValue = intValue%2;    binArray[index] = modValue;    while(divValue!=0) {        modValue = divValue%2;        binArray[--index] = modValue;        divValue/=2;    }}unsigned char bin2int(char *bin,int binSize) {    int i,j;    unsigned char intValue = 0;        for(i=binSize-1,j=0;i>=0;i--,j++) {        intValue += (bin[i] * pow(2,j));        }    return intValue;}int main() {    FILE *fr,*fw;    unsigned char dataFromFile[8] = {0};//8*8=64位的数据,每个元素为一个字节    unsigned char dateEncode[8] = {0};//加密后的字节     unsigned char binArray[64] = {0};//64位二进制数据,作为明文    int i,j;    /*    int test = 255;    char testBin[8] = {0};    */        if ((fr=fopen("read.txt","rb"))==NULL) {        printf("can not open read.txt for read\n");        return -1;    }    if ((fw=fopen("write.txt","wb"))==NULL) {        printf("can not open write.txt for write\n");        return -2;    }        while (fread(dataFromFile,sizeof(char),8,fr)) {        if (num<8) {            for (i=num;i<8;i++) {                dataFromFile[i] = 0;            }                }                for (i=0;i<8;i++) {            printf("%d ",dataFromFile[i]);            int2bin(dataFromFile[i],binArray+i*8,8);        }        printf("\n");        for (i=0;i<8;i++) {            dateEncode[i] = bin2int(binArray+i*8,8);            printf("%d ",dateEncode[i]);        }        printf("\n");        fwrite(dateEncode,sizeof(char),8,fw);    }        fclose(fr);    fclose(fw);    /*    int2bin(test,testBin,8);    for (i=0;i<8;i++) {        printf("%d ",testBin[i]);    }    printf("\n");    test = bin2int(testBin,8);    printf("%d \n",test);    */        return 0;}


上面的是源码,本想着,经过我把十进制转化为二进制,再把二进制转化为十进制后,结果回事一样的,但是事与愿违,看了好久,没有发现错误。贴出来和大家一起商量。
我的思路是这样的,我本想讲文件加密,发现加密的过程出现了问题,第一加密、解密是正确的,以后的内容解密出来后都是乱码。我的单次加解密是正确的。怀疑在读写文件的时候出了问题。于是我把读写文件的内容单独摘了出来,如上面所示。
文件的操作过程是这样的,先用fread读取8个char类型的数字,然后将每一个数字转化为8个由0或者1组成的数组,最终形成一个8*8=64个元素的数组,然后对这个64位的明文进行加密和解密(在源代码中省略了,源码给出的是没有经过加解密的数据),然后将这个64位的数组进行转化,每8位转化成一个char类型的数字,结果发现转化后的数字跟原来读取出来的数字不一样,特别是在遇到回车符的时候,肯定出错。



[解决办法]
我来拿个分哈
// 这个地方一定要在赋值前将数组中的元素值清零,然后数组才能被正确赋值,为什么呢?
for (i=0;i<index;i++) {
binArray[i] = 0;
}
如果是为什么要循环清0的话,是因为你下面的赋值语句,有关系
while(divValue!=0) {
modValue = divValue%2;
binArray[--index] = modValue;
divValue/=2;
}
操作没有完整的闭合
在尾部增加
while(index>0)
{
binArray[--index]=0;
}

热点排行