文件操作下

 

各种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

  1. 对于文件指针:先写后读,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

失败返回-1