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