c c file - yaokun123/php-wiki GitHub Wiki
磁盘文件:指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。
设备文件:在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把他们的输入、输出等同于对磁盘文件的读和写。
计算机的存储在物理上的是二进制的,所以物理上所有的磁盘文件本质上都是一样的。以字节为单位进行顺序存储。
从用户或者操作系统使用的角度(逻辑上)把文件分为:
文本文件:基于字符编码的文件
基于字符编码,常见编码有ASCII、UNICODE等
一般可以使用文本编辑器直接打开
数5678的以ASCII存储形式(ASCII码)为:00110101 00110110 00110111 00111000
存储时,是将字符的ascii值存在磁盘中。
取出时,是将ascii值翻译为对应的字符。
二进制文件:基于值编码的文件
基于值编码,自己根据具体应用,指定某个值是什么意思
把内存中的数据按其在内存中的存储形式原样输出到磁盘
数5678的存储形式(二进制码)为:00010110 00101110
存的是二进制,取的是二进制
1、打开文件:FILE *fp = fopen("pathname","mode")
#include<stdio.h>
int main(){
FILE *fp = fopen("./test.txt","r");//打开一个文件,成功返回FILE结构体地址,失败返回NULL
if(fp == NULL){
printf("fopen fail\n");
perror("[]");//打印错误日志
return 0;
}
printf("fopen success\n");
return 0;
}
2、关闭文件:fclose(*fp)
3、写文件:
写入一个字符到文件中:成功返回写入的字符,失败返回-1
fputc(int ch,FILE * stream)
将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0'不写入文件:成功0,失败-1
int fputs(const char * str,FILE * stream)
根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,出现字符串结束符'\0'为止
int fprintf(FILE * stream,const char format,...)
以数据块的方式给文件写内容,成功返回写入文件数据的块数目,次值和nmemb相等
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE * stream);
4、读文件:
从文件中读取一个字符:成功返回读取到的字符,失败返回-1
fgetc(FILE *stream)
读取字符串:成功返回字符串,失败NULL
char * fgets(char *str,int size,FILE * stream);
从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据,成功返回转换个数,失败-1
int fscanf(FILE * stream, const char * format,...)
以数据块的方式从文件中读取内容,成功返回读取到内容的块数,如果此值比nmemb小,但大于0,说明读到了文件的结尾,失败0
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
注意:如果读取文件不是存文本,有像-1这种数字,那么就不可以使用EOF(-1)作为文件的结尾。可以使用feof(FILE * stream)
5、文件的随机读写
移动文件流(文件光标)的读写位置
int fseek(FILE *stream,long offset,int whence);
把文件流(文件光标)的读写位置移动到文件开头
void rewind(FILE * stream);
获取文件流(文件光标)的读写位置
long ftell(FILE * stream);
6、获取文件状态信息
获取文件状态信息
int stat(const char *path,struct stat * buf)
删除文件、重命名文件
删除文件:
int remove(const char * pathname);
重命名文件:
int rename(const char *oldpath,const char *newpath)
缓冲区:就是内存中一块临时的空间
fflush:强制刷新缓冲区
windows:标准输出stdout文件没有缓冲区
linux:标准输出stdout文件有缓冲区,遇到‘\n’才会刷新