打开一个流式文件:
头文件:#include<stdlib.h>
FILE* fa = fopen(const char *path,const char *mode);
fclose(fa);//用完要关闭文件。
如果成功返回file类型指针,如果错误返回NULL.
const char *path指文件名,const char *mode指使用文件方式(r【只读】,r+【读写】,a【写追加】,a+【读写追加】,w【写或建】,w+【写或建,可读】t【文本文件】,b【二进制文件】)
只有w和w+,a和a+有创建功能。
PS:文件指针有两个!一个是读指针,一个是写指针。如果用a+方式打开文件,注意读写指针的位置是不一样的!!!
例如 : FILE* fp=fopen("a.txt","w"); //若有a.txt则清除原内容,重新写入;若无则新建一个a.txt。=============================================================
对一个流式文件的顺序读写:
头文件:#include<stdio.h> (在此头文件中,EOF为定值-1)
int fgetc(FILE* fp);
功能:读取文件指针fp目前所指文件位置中的字符,进行返回。读取完毕,文件指针自动往下一移一个字符位置,若文件指针已经到文件结尾,返回-1。
int fputc(char ch,FILE* fp);
功能:把字符ch写入文件指针fp所指向文件的位置,成功时返回字符的ASCII码,失败时返回EOF。
PS:只能一个一个字符循环写入,不可写入字符串。
char *fgets(char *str, int n, FILE* fp);
功能:在文件指针fp所指文件位置读取n个字符并放入str字符数组中。如果读不到字符串(到达文件结尾),则返回NULL。
PS:n为获取的元素个数,如果个数大于一行,则提取一行,小于一行则提取n-1个元素,后面自动补充'\0'!!!!!!
int fputs(char* str , FILE *fp);
功能:将字符串str写入文件指针fp所指文件的位置,写入数据成功时返会非0值,写入失败时返回EOF。
int fscanf(FILE* fp , “格式化字符串”,【输入项地址表】);
功能:从文件指针fp所指向的文件中按照格式字符串指定的格式将文件中的数据送到输入项地址表中。若读取数据成功会返回所读取数据的个数,并将数据按照指定格式存入内存中的变量或数组中,文件指针自动乡下移动;若读取失败则返回0。
例如: 文件中的数据为(学号,姓名,性别,中间以空格分开):190201 凌峰 男
char num[20],name[40],sex[5];
FILE* fp = fopen("e:\\code\\test.txt","rt");
fscanf(fp,"%s %s %s".num,name,sex);
将学号,姓名,性别分别赋值给字符数组num,name和sex。
int fprintf(FILE* fp , “格式化字符串”,【输出项地址表】);
char num[20] = “190525”,name[40] = “小明”,sex[5] = “女”;
FILE* fp = fopen("e:\\code\\test.txt","rt");
fputc('\n',fp);
fscanf(fp,"%s %s %s".num,name,sex);
test.txt里为:
int fread(void* buffer, int size, int count, FILE* fp);
int fwrite(void* buffer, int size, int count, FILE* fp);
==============================================================
#include<stdlib.h>
char* fgets(const void *ptr, size_t size, FILE *stream)
size为获取的元素个数,如果个数大于一行,则提取一行,小于一行则提取size-1个元素,后面自动补充'\0'。如果到达文件结尾,gets失败,则返回NULL。
============================================================
文件的随机读写:
void rewind(FILE* fp);
int fseek(FILE *fp, long offset, int whence);
其中:whence包括 SEEK_SET(0)初始位置,SEEK_CUR(1)当前位置, or SEEK_END(2)结束位置,3种状态。
fseek(fp,-10L,0); //文件往前偏移不能超过其开头的初始位在,err
fseek(fp, 3L, 2);//文件可以在结尾向后偏移,返回值为EOF(-1)。
int ftell(FILE* fp);
功能:得到流式文件的当前位置,用相对于文件开头的位移量来表示。出错返回-1L。
===========================================================
查看错误信息:
在vim /usr/include/asm-generic/errno.h中查看error number文件内容。
例子:
FILE *fp=fopen("a.txt","r");
if(fp==NULL){
perror("fopen:\n"); //输出“ ”里面的字,并给出错误信息。
exit(EXIT_FAILURE);
}
=========================================================
正常退出运行程序
exit 与 return 的区别:空间清理 exit,可以在程序结束时帮助关闭文件。头文件: #include<stdlib.h>
void exit(int status);
exit(EXIT_FALURE); --exit(1); 错误退出
exit(EXIT_SUCCESS); --exit(0); 正常退出
========================================================
文件IO操作:
标准IO 系统IO
标准库中的IO操作 针对于当前系统提供的IO操作fopen fread fwrite open read
fgets fputs ...(f)
stdin 标准输入流
stdout 标准输出流
stderr 标准错误流
例:int ch=fgetc(stdin) //在输入界面输入。
系统IO的标准输入输出
定义在/usr/inlcude/unistd.hSTDIN_FILENO 0
STDOUT_FILENO 1
STDERR_FILENO 2
=============================================================
缓冲区问题:
标准输入库中基本上都带缓冲区行缓冲:当前行满的时候,才刷新缓冲区的内容。
全缓冲:当缓冲区满的时候,才对缓冲区刷新一次。
不缓冲:不带缓冲区(系统IO)
例:printf不足一行,没有\n结尾的情况下,如果程序不结束,将不会输出。
int fflush(FILE *stream); //强制刷新缓冲区
eg:fflush(stdout);