C++ 文件处理
官方文档:http://www.cplusplus.com/reference/cstdio/fopen/
相关内容简介:
- fopen方法的介绍
- 文本文件读取
- 写入文本文件
- 二进制文件读写
- 读取文件大小
- 文本文件加解密
- 二进制文件的加解密
fopen
fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息
FILE *fopen(const char *filename, const char *mode)
filename:文件的路径
mode:表示打开文件的模式,如下图:
mode类别.png
二进制文件和文本文件读写的区别:
写文本 '\n’-> \r\n
读文本 \r\n -> \n
文本文件读取
test.txt:
这只是一个单纯的文件
用来测试的,不要想多了。
栗子代码:
int main()
{
char *path = "D:\\NDK\\class\\files\\test.txt"; //必修使用两个\\ 否则会报错
FILE *fp = fopen(path, "r");
if (fp == NULL) {
printf("文件不存在,或者加载文件失败...");
return 0;
}
char buff[500];
while (fgets(buff, 50, fp))
{
printf("%s", buff);
}
fclose(fp);
system("pause");
return 0;
}
写入文本文件
test.txt 还是上面的文件
栗子代码:
int main() {
char *path = "D:\\NDK\\class\\files\\test.txt";
FILE *fp = fopen(path, "w");
if (fp == NULL) {
printf("failed。。。。");
return 0;
}
char *text = "C++开发,我看好你";
fputs(text, fp);
fclose(fp);
system("pause");
return 0;
}
二进制文件读写
实现一个exe文件读取,再进行输出到新的路径
用到了fread和fwrite两个读和写的方法
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
从给定流 stream 读取数据到 ptr 所指向的数组中
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
把 ptr 所指向的数组中的数据写入到给定流 stream 中
栗子代码:
int main() {
char * read_path = "D:\\NDK\\class\\files\\testPro.exe";
char * write_path = "D:\\NDK\\class\\files\\testPro_write.exe";
//read
FILE * read_fp = fopen(read_path, "rb"); //rb 表示读取二进制
//write
FILE * write_fp = fopen(write_path, "wb"); //wb 表示写入二进制
char buff[50];
int len = 0;
while ((len = fread(buff, sizeof(char), 50, read_fp)) != 0)
{
fwrite(buff, sizeof(char), len, write_fp);
}
fclose(read_fp);
fclose(write_fp);
system("pause");
return 0;
}
读取文件大小
先看两个方法:
- fseek :设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。
int fseek(FILE *stream, long int offset, int whence)
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset -- 这是相对 whence 的偏移量,以字节为单位。
whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
whence.png
- ftell:返回给定流 stream 的当前文件位置。
long int ftell(FILE *stream)
栗子代码:读取图片文件的大小
int main() {
char *read_path = "D:\\NDK\\class\\files\\beauty.png";
FILE *fp = fopen(read_path, "r");
if (fp == NULL)
{
return 0;
}
fseek(fp, 0, SEEK_END); //表示文件指向文件末尾
long filesize = ftell(fp); //获取当前文件位置
printf("%ld \n", filesize);
system("pause");
return 0;
}
文本文件加解密
异或算法:不相同的为1,相同为0
1001 ^ 0111 = 1110
1110 ^ 0111 = 1001
加密上面的test.txt文件,代码:
void encode(char normal_path[], char encode_path[]) {
FILE * normal_fp = fopen(normal_path, "r");
FILE * encode_fp = fopen(encode_path, "w");
int ch;
while ((ch = fgetc(normal_fp)) != EOF){
fputc(ch ^ 7, encode_fp);
}
fclose(normal_fp);
fclose(encode_fp);
}
void decode(char encode_path[], char decode_path[]) {
FILE * normal_fp = fopen(encode_path, "r");
FILE * encode_fp = fopen(decode_path, "w");
int ch;
while ((ch = fgetc(normal_fp)) != EOF) {
fputc(ch ^ 7, encode_fp);
}
fclose(normal_fp);
fclose(encode_fp);
}
int main() {
char * nomal_path = "D:\\NDK\\class\\files\\test.txt";
char * encode_path = "D:\\NDK\\class\\files\\test_encode.txt";
char * decode_path = "D:\\NDK\\class\\files\\test_decode.txt";
//encode(nomal_path, encode_path);
decode(encode_path, decode_path);
system("pause");
return 0;
}
二进制文件的加解密
这边采用的传进加密密码,加密和解密的密码必须一致,否则,无法解密出来
void biEncode(char normal_path[], char encode_path[], char * password) {
FILE * normal_fp = fopen(normal_path, "rb");
FILE * encode_fp = fopen(encode_path, "wb");
int ch;
int pwd_legth = strlen(password);
int i = 0;
while ((ch = fgetc(normal_fp)) != EOF){
fputc(ch ^ password[i % pwd_legth], encode_fp);
i = (i++) % 10001;
}
fclose(normal_fp);
fclose(encode_fp);
}
void biDecode(char encode_path[], char decode_path[], char * password) {
FILE * normal_fp = fopen(encode_path, "rb");
FILE * encode_fp = fopen(decode_path, "wb");
int ch;
int pwd_legth = strlen(password);
int i = 0;
while ((ch = fgetc(normal_fp)) != EOF) {
fputc(ch ^ password[i % pwd_legth], encode_fp);
i = (i++) % 10001;
}
fclose(normal_fp);
fclose(encode_fp);
}
int main() {
char * nomal_path = "D:\\NDK\\class\\files\\beauty.png";
char * encode_path = "D:\\NDK\\class\\files\\beauty_encode.png";
char * decode_path = "D:\\NDK\\class\\files\\beauty_decode_.png";
biEncode(nomal_path, encode_path, "ILoveYou");
biDecode(encode_path, decode_path, "ILoveYou");
system("pause");
return 0;
}
结语
以上就是C++的文件相关操作,只是为了记录知识点,也欢迎大家阅读和错误指正。
网友评论