首先从获取文本文件长度下手:
获取文本文件长度比较这两种办法的差异:
extern int getFileSizeError() {
FILE *fsource = fopen(strFile, "r");
if (fsource == NULL) {
return -1;
}
char tmp;
int length = 0;
while ((tmp = fgetc(fsource)) != EOF) {
length++;
}
fclose(fsource);
return length;
}
extern int getFileSize() {
FILE *fsource = fopen(strFile, "rb");
if (fsource == NULL) {
return -1;
}
char tmp;
int length = 0;
while ((tmp = fgetc(fsource)) != EOF) {
length++;
}
fclose(fsource);
return length;
}
得到的文件大小不一样,现在看一个例子看一下问题的根本是什么
extern void writeFile() {
FILE *file = fopen(shaoTestOut, "w");
int i = 0;
for (; i < 5; i++) {
fputc('\n', file);
}
fclose(file);
}
这个时候文件大小实际是10Byte大小,
getFileSizeError()结果只有5Byte而getFileSize()结果有10Byte,原因是'\n'写入文件的时候系统会自动写入"\r\n",读取文件的时候会将"\r\n"识别为'\n'
所以读取文件大小的时候应当用二进制读取方式,这样"\r\n"就会以'\r','\n'两个字节方式读取
或者可以用这个方法
extern int getFileSize2() {
FILE *fsource = fopen(shaoTestOut, "r");
if (fsource == NULL) {
return -1;
}
char tmp;
int length;
while ((tmp = fgetc(fsource)) != EOF) {
if (tmp == '\n') {
length += 2;
} else {
length += 1;
}
}
fclose(fsource);
return length;
}
通过上面获取文件长度的函数明白了二进制文件与文本文件的区别就是"\r\n"的处理,下面来看一段文件读取的操作
一般文本文件保存的是1-127的Asca值,默认是unsigned char类型的,如果操作的时候写入的是char类型的如写入--1
extern void wrietTest() {
FILE *fsource = fopen(shaoTestOut, "w");
char ch = -1;
fputc(ch, fsource);
fclose(fsource);
}
extern void readTest() {
FILE *fsource = fopen(shaoTestOut, "r");
char ch = fgetc(fsource);
if (ch == EOF) {
printf("yes eof %d\n", ch);
} else {
printf("no eof %d\n", ch);
}
}
如果采用
extern void readTest() {
FILE *fsource = fopen(shaoTestOut, "r");
int ch = fgetc(fsource);
if (ch == EOF) {
printf("yes eof %d\n", ch);
} else {
printf("no eof %d\n", ch);
}
}
结果就是
所以为防止fgetc溢出的情况我们会采用int ch = fgetc()来进行读写
现在来试一下文件加密解密的过程
extern void jiajieWithPwd(char *source, char *out, char *pwd) {
int fileSize = getFileSize();
int length = strlen(pwd);
FILE *fsource = fopen(source, "rb");
FILE *fout = fopen(out, "wb");
if (fsource == NULL || fout == NULL) {
return;
}
int i = 0;
int j = 0;
for (; i < fileSize / length; i++) {
for (j = 0; j < length; j++) {
int ch = fgetc(fsource);
ch = ch ^ pwd[j];
fputc(ch, fout);
}
}
j = 0;
for (; j < fileSize % length; j++) {
int ch = fgetc(fsource);
ch = ch ^ pwd[j];
fputc(ch, fout);
}
fclose(fsource);
fclose(fout);
}
这样就可以实现完美的加密解密操作