文件操作下
各种printf对比记忆
printf--sprintf--fprintf
都是变参函数:参数形参中有"...",最后一个固参通常是格式描述串(包含格式匹配符),函数的参数个数、类型、顺序都由固参来决定。
printf对应的是屏幕输出
printf("hello");
printf("%s",hello);
sprintf对应的是字符串输出
char buf[1024];
sprintf(buf,"%d = %d%c%d\n",10+5,10,'+',5);
fprintf对应的是输出到文件中
FILE *fp = fopen()
fprintf(fp,"%d",5);
各种scanf函数对比记忆
scanf()
从键盘中读取
int a;
scanf("%d",&a);
sscanf()
从字符串中读取
char a[] = "1+2";
int num1,num2;
char ch;
sscanf(a,"%d%c%d",&num1,&ch,&num2);
fscanf()
FILE *fp = fopen()
int m;
fscanf(fp,"%d",&m);
fprintf()函数和fscanf()函数
fprintf()函数
原型:int fprintf(FILE *stream,const char *format,...);
后面...也就和printf差不多
fscanf()函数
int fscanf(FILE *stream,const char *format...);
同上
特征:
fscanf和fprintf函数如果成功就会返回匹配成功的个数,如果失败就返回-1。
边界溢出:每次读取后都会清空缓存区
fscanf()函数,在每次调用时都会判断下一次是否匹配参数2,如果不匹配提前结束读文件。
demo运用
文件版排序:生存随机数写入文件后,再读出排序好后重新输入
https://www.cnblogs.com/beautiful7/p/13951888.html
fwrite()和fread()函数
fwrite()和fread()函数既可以处理文本文件,也可以处理二进制文件。但是写入时是用二进制格式写入。
fwrite()函数
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream)
参数:
参1:const void *ptr:意思是要传入的首地址。
参2:size_t size:表示带写入数据大小
参3:size_t nmemb:表示需要写入的数据个数
参4:文件指针
参2*参3=写出数据的大小
返回值
成功:永远返回真正输入的参3的值
失败:返回0
通常将参2设置为1,参3为实际字节数
fread()函数
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
参数:
参1:表示写入的首地址
其它同上
返回值:
同上
文件拷贝demo
https://www.cnblogs.com/beautiful7/p/13951888.html
移动文件指针光标
文件读写指针在一个文件里只有一个
fseek()ftell()fwind()函数
fseek()
int fseek(FILE *stream,long offset,int whence)
参数
参1:文件指针
参2:偏移量
参3: SEEK_SET:文件开头位置
SEEK_CUR:当前位置
SEEK_END:文件结尾位置
返回值:
成功返回0
失败返回-1
ftell()函数
获取文件读写指针位置
long ftell(FILE *stream);
返回:从文件当前位置到起始位置的偏移量
可以借助fseek(fp,0,SEEK_END)和ftell(fp)来获取文件大小
rewind()
void rewind(FILE *stream);
将读写指针移到起始位置
linux和windows文件区别
1 对于二进制文件,Windows需要添加“b"来操作,Linux下二进制和文本文件没有区别
2 windows下,回车为\r,换行为\n。Linux下回车换行都是\n
-
对于文件指针:先写后读,Windows和linux效果一样
先读后写:LINUX不用修改,Windows需要在写操作前添加fseek(fp,0,SEEK_CUR)来获取文件读写指针
获取文件状态:
如果用fseek(fp,0,SEEK_END)和ftell(fp)需要打开文件来获取对系统消耗很大,采用更好的方式来处理。
in stat(const char *path,struct stat *buf);
参1:路径
参2:文件属性结构体
返回值:
成功 0
失败 -1
删除、重命名文件:
int remove(const char *pathname);删除文件
int rename(const char *oldpath,const char *newpath);重名文件
缓冲区刷新
标准输出--stdout--标准输出缓冲区:
写给屏幕的数据,都是现存缓冲区中,由缓冲区一次性刷新到屏幕中
标准输入--stdin--标准输入缓冲区:
从键盘读取的数据,知道读到缓冲区中,由缓冲区给程序提供数据
行缓冲:
printf();遇到\n就会将缓冲区中的数据刷新到物理设备上
全缓冲:
文件。缓冲区存满,数据刷新到物理设备上
无缓冲:
perror。缓冲区中只要有数据,就立即刷新到物理设备上
文件关闭时,缓冲区会被自动刷新。
隐式回收:关闭文件、刷新缓冲区、释放malloc
手动刷新缓冲区:实时刷新。
int fflush(FILE *stream);
成功返回0