标准I/O操作:
1、FILE* fopen(const char* path, const char* mode)
FILE :文件打开的各种状态信息的指针;
path: 文件路径;注意,目录文件只能以只读形式打开,不能进行写;
mode: 文件打开的模式: “r”(只读,且文件必须存在),“w”(只写,如果文件不存在,则创建,如果已经存在,则将其长度截断为0,从头写),“a”(表示追加数据到末尾,如果文件不存在,则创建),“r+”,“w+”,“a+”;
2、int fgetc(FILE *stream) 从文件或终端中读取一个字节返回,本来应该返回uchar类型,但是函数原型的返回值是int型,所以要转化为扩展为int型的;这个函数既可以从终端读,也可以从文件中读;
3、int getchar(void) 从终端(只能从终端)中读取一个字节,返回时扩展为int型,原因同上;
4、int fputc(int c,FILE* stream);int putchar(int c); 为写入函数,写入是文件必须是可写的;
5、int fseek(FILE* stream, long offset ,int whence) 用于设置读写指针偏移,返回相对于文件起始位置的偏移量大小;
6、int ftell(FILE *stream) 用于返回当前读写指针的位置;
7、void rewind(FILE *stream) 用于读写指针移动到文件的起始位置;
8、char* gets(char *s)从标准输入一行保存在缓冲区,但是永远不要用这个函数;因为未指定缓存区的大小,所以很容易产生缓冲区溢出,造成错误;
9、char* fgets(char *s, int size, FILE* stream) 表示从指定的文件中读取一行,到用户指定的缓冲区;返回的指针是指针s移动后的位置;
注意: fgets()只适用于读不含‘\0’的文本文件,因为fgets()会自动在末尾加‘\0’,但是,如果用户在输入中也输入‘\0’,那么就无法识别是fgets自己加的,还是用户加的;另外,由于’\0‘的ASIIC 是0x00,所以在不能读二进制文件;
10、int fputs(const char *s, FILE* stream); 将字符串写入到文件中,不含末尾的’\0‘;
int puts(const char* s); 将字符串写入到标准输入中;
11、对文件进行的任何操作,都要先明白读写指针在什么地方,这个决定了你读写的位置;
12、fread(void *str, size_t size, size_t nmemb, FILE* stream) 从文件stream 中读取nmemb 个大小为size字节大小的数据到 str;
fwrite(void *str, size_t size, size_t nmemb, FILE* stream) 同上,是写入文件;
13、全缓冲:等待缓冲区写满以后,才写入内核;常规文件用此方式;
行缓冲:等待有换行符的时候,就写入内核;标准输入输出用这种方式;
不带缓冲:用户每次写操作都要调用系统调用,写入内核;
int fflush(FILE* stream) 用于将缓冲区的数据立即写入内核;成功返回0;
14、标准文件流:FILE: stdin ,stdout, stderr;