一、文件操作
在linux中对所有的外部设备都当成了文件,包括键盘-浏览器-显示器等。
文件分为两部分:控制信息(图片的头等信息),内容信息(实际内容)
文本文件-图片和 二进制文件的区别:本质上都是二进制文件,只是文本文件是一种特殊的二进制文件没有其他信息
读文件:磁盘->文件缓冲区->应用程序内存空间
C语言中二进制文件和文本文件读写的区别:
写文本的时候: '\n' 被替换成 \r\n
读文本的时候: \r\n 读成 '\n'
- 1.读取文本文件
#include "stdafx.h"
#include <stdlib.h>
int main(){
//文件路径(C语言中单斜杠要改成双斜杠)
char * path = "F:\\read.txt";
//打开文件的api 返回一个文件所在的地址fp
FILE *fp = fopen(path,"r"); //r :读
//开辟一个50的char数据 存取都出来的内容
char buff[50];
//fgets(): 每次从指针里面获取50大小的数据放到buff里面
while (fgets(buff,50,fp)){
printf("%s ", buff);
}
//一但写了读取文件 就点记得fclose
fclose(fp);
system("pause");
return 0;
}
-
2.写文本文件
#include "stdafx.h" #include <stdlib.h> int main(){ //文件路径(C语言中单斜杠要改成双斜杠) char * path = "F:\\write.txt"; //打开文件的api 返回一个文件所在的地址fp FILE *fp = fopen(path,"w"); //w :写 如果文件不存在会自动创建 if (fp==NULL){ printf("failed..."); return 0; } char * text = "胡斌20170904.。。"; //需要写入的字符 fputs(text, fp); fclose(fp); //关闭写入 system("pause"); return 0; }
3.读写二进制文件(文件复制),预计要比java的读写快10倍左右。
#include "stdafx.h"
#include <stdlib.h>
int main(){
char * read_path = "F:\\txupd.exe"; //读路径
char * write_path = "F:\\write.exe";//写路径
FILE *read_fp = fopen(read_path,"rb"); //rb:以二进制形式读取 r:读的是纯文本
FILE *write_fp = fopen(write_path, "wb");//wb:以二进制形式写
char buff[50];
int len = 0;
//每次读取50个sizeof(char)大小的数据
while ((len=fread(buff,sizeof(char),50,read_fp))!=0){
//fwrite():每次从buff里面取长度为len以char为单位的数据写到write_fp里面
fwrite(buff, sizeof(char), len, write_fp);
}
fclose(read_fp);
fclose(write_fp);
system("pause");
return 0;
}
- 4.获取文件大小
#include "stdafx.h"
#include <stdlib.h>
int main(){
char * read_path = "F:\\txupd.exe"; //路径
FILE *fp = fopen(read_path,"r");
if (fp==NULL){
return 0;
}
//fp指针要指向文件的末尾 偏移量为0
//对fp做位移,fseek(fp,偏移量,指针开始的位置)
//SEEK_SET 指向设置的位置
//SEEK_END 文件末尾
fseek(fp, 0, SEEK_END); //设定指针位置
long filesize = ftell(fp); //取得文件大小
printf("%ld\n", filesize);
fclose(fp);
system("pause");
return 0;
}
二、文件加解密
- 1.文本文件加解密
//加密
void encode(char normal_path[], char encode_path[]){
FILE * normal_fp = fopen(normal_path, "r");
FILE * encode_fp = fopen(encode_path, "w");
//打开文件复制到encode_fp中
int ch;
while ((ch=fgetc(normal_fp))!=EOF){ //EOF == -1:文件结束的标记
fputc(ch^7, encode_fp); //简单的加密算法: ^(异或) 7
}
fclose(normal_fp);
fclose(encode_fp);
}
//解密
void decode(char encode_path[], char decode_path[]){
FILE * encode_fp = fopen(encode_path, "r");
FILE * decode_fp = fopen(decode_path, "w");
//打开文件复制到encode_fp中
int ch;
while ((ch = fgetc(encode_fp)) != EOF){ //EOF == -1:文件结束的标记
fputc(ch ^ 7, decode_fp); //简单的加密算法: ^(异或) 7
}
fclose(encode_fp);
fclose(decode_fp);
}
int main(){
//加密
char* nomal_path = "F:\\text.txt";
char * encode_path = "F:\\text_encode.txt";
encode(nomal_path,encode_path);
/*
//解密
char * encode_path = "F:\\text_encode.txt";
char * decode_path = "F:\\text_decode.txt";
decode(encode_path,decode_path);
*/
return 0;
}
-
2.二进制文件加解密
#include "stdafx.h" #include <stdlib.h> #include <string.h> /* *加密 *normal_path: 原始文件路径 *encode_path: 加密文件路径 *password: 加密密码 */ void encode(char normal_path[], char encode_path[],char * password){ FILE * normal_fp = fopen(normal_path, "rb"); FILE * encode_fp = fopen(encode_path, "wb"); //打开文件复制到encode_fp中 int ch; int i = 0; int pwd_length = strlen(password); while ((ch=fgetc(normal_fp))!=EOF){ //EOF == -1:文件结束的标记 fputc(ch^password[i%pwd_length], encode_fp); //简单的加密算法: ch^ (i%密码长度) i = (i++) % 10001; //为了防止i溢出 % 10001 } fclose(normal_fp); fclose(encode_fp); } /** *解密 *encode_path :加密文件路径 *decode_path :解密文件路径 *password : 解密密码 */ void decode(char encode_path[], char decode_path[],char* password){ FILE * encode_fp = fopen(encode_path, "rb"); FILE * decode_fp = fopen(decode_path, "wb"); //打开文件复制到encode_fp中 int ch; int i = 0; int pwd_length = strlen(password); while ((ch = fgetc(encode_fp)) != EOF){ //EOF == -1:文件结束的标记 fputc(ch^password[i%pwd_length], decode_fp); //简单的加密算法: ^(异或) 7 i = (i++) % 10001; } fclose(encode_fp); fclose(decode_fp); } int main(){ char* nomal_path = "F:\\text.png"; char * encode_path = "F:\\text_encode.png"; char * decpde_path = "F:\\text_decode.png"; //加密 encode(nomal_path,encode_path,"hubin"); //解密 //decode(encode_path, decpde_path, "hubin"); return 0; }
三、预处理
还没有编译程序的时候会先进行预处理,以下是预处理的几种情况
-
1.头文件引入
1>创建A.txt 文件printf("hello hubin\n");
2>代码中引入文件,执行文件中定义好的代码
#include "stdafx.h"
#include <stdlib.h>
int main(){
//直接引入A.txt 文件里面的代码
//预处理阶段完成代码的替换
#include "A.txt"
system("pause");
}
-
2.宏定义1
#include "stdafx.h" #include <stdlib.h> #include <string.h> //define宏定义: //将5;用NUM 替换,完全等价的替换 甚至后面如果加一个;都会替换掉,这是一种文本替换预处理阶段不会对这个定义进行任何的检查 #define NUM 5; int main(){ for (int i = 0; i < NUM i++){ //代码中都不用再写分号 printf("%d\n", i); } system("pause"); return 0; }
-
3.宏替换2
#include "stdafx.h" #include <stdlib.h> //typedef 是取别名 他跟 #define 是不同的 //#define宏定义:标识符 字符串 //字符串替换 #define MAX(x,y) ((x)>(y))?x:y; int main(){ int max = MAX(3,5); printf("%d\n", max); system("pause"); return 0; }
4.头文件引入(#include <> 与 #include "")
1> "" 表示自己创建的头文件,没有包含在调试源文件中的
2> <> 表示在包含文件目录中去查找,即配置在了调试源文件中的头文件
-
5.条件编译(#ifdef 和 #endif)
#include "stdafx.h" #include <stdlib.h> //#define M int main(){ //#ifdef 跟 #endif 是成对出现的 //如果定义了#define M 就打印110,如果没有定义宏#define M 就打印120 #ifdef M printf("%d\n", 110); #else printf("%d\n", 120); #endif system("pause"); return 0; }
6.更多关于宏定义
详细笔记: day05_ndk_宏定义笔记.doc
C 语言执行的流程:
无参宏定义
带参宏定义
文件包含
#include <> 或者 #include “” 区别
条件编译