在学习了C语言之后,我们还有一个必须要知道的就是C语言自带的IO库函数,通过库函数我们可以对文本进行读写创建等等操作,可以将C语言的文本库理解为简单的数据库,可以存储数据和读取数据。
1、文本的打开
FILE *fp=NULL;
fp = fopen("./test.txtx","r");
if(!fp){
printf("fopen err\n");
return -34;
}
printf("fopen success\n");
#include <stdio.h> //头文件
FILE *fopen(const char *path, const char *mode);
path:文件路径,可以相对,也可以绝对地址
mode: 打开权限
"r": 只读 readonly
"r+": read and write
"w": 不存在则创建,存在则清零文件,只写方式打开
"w+": 比 w增加了read权限,首先清空
"a": append, writeonly,以追加方式打开,不存在则创建
"a+": 增加read
返回值:
success 返回文件指针,以后read write 都通过改指针进行
failed NULL
2、文本的关闭
ret = fclose(fp);
if(ret==EOF){
printf("fclose err\n");
return -3;
}
printf("close success EOF=%d\n",EOF);
#include <stdio.h>
int fclose(FILE *stream);
stream: 文件指针
return:
0-success
-1/EOF- failed
3、文本的读取
char rbuf[128] = {0};
int ret = fread(rbuf,1,sizeof(rbuf),fp);
if(ret ==0 ){
if( feof(fp) ){
printf("find end of file\n");
}else if( ferror(fp) ){
printf("find err of read\n");
return -34;
}
}
printf("got len=%d, data=%s\n",ret,rbuf);
读: 从物理文件读取内容到 内存
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:存放数据的buf,你分配的空间
stream:上面打开的文件描述符
size, nmemb: 我们一次要读取很多块(num member block),每块多大(size B)
返回: 实际读取的 块个数
0: 1) 没有数据了 2)出错了
你要使用 int feof(FILE *fp); 0-没有结尾 其他-结尾
int ferror(FILE *fp) 0-没有出错 其他-出错了
4、文件的写入
char wbuf[64]="good good study ,day day up!";
ret = fwrite(wbuf,1,strlen(wbuf),fp);
if( ret < strlen(wbuf) ){
printf("write err\n");
return -34;
}
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
ptr:存放了要写入的数据
stream:文件指针
size,nmemb : 你要写入多少个块(nmemb),每个快有多大(size)
返回值:
实际写入的块个数 ,如果出错 返回值小于nmemb
5、单个字符连续的读取
while(1)
{
char c = fgetc(fpsrc);
if(c==EOF){
printf("file end\n");
fclose(fpsrc);
fclose(fpdst);
return 0;
}
}
int fgetc(FILE *stream);
stream:文件
返回值: -1,文件结束
成功,记得到一个字符 (char)
6、单个字符的写入
char m = fputc(c,fpdst);
if(m==EOF){
printf("fputc err\n");
int fputc(int c, FILE *stream);
返回值: 就是你写入的字符c, 出错返回-1/EOF
7、字符串的读取
char rbuf[1024] ;
while(1){
char *s = fgets(rbuf,sizeof(rbuf),fp);
if(s==NULL){
printf("find end of file\n");
return -3;
}
printf("%s",rbuf);
}
char *fgets(char *rbuf, int size, FILE *stream);
rbuf:存数据的buf
size:rbuf的大小
stream:文件指针
最多读取size-1个字符,最后一个存放\0
读到一个换行符结束 ,或者读到文件结尾
读完结束之后,fgets它帮你添加一个\0
1) 遇到换行符,fgets结束,自动帮你在后面追加\0
2) 如果一行大小超过rbuf,则读取size-1个字符后,结束. 自动追加\0
如果一行没有读取完毕,下次继续读取改行.
so,buf尽可能的大
3)文件结束,添加\0结束.
返回值:
成功--返回rbuf
NULL- end of file , or error occurs
8、获取文件位置指针
ret = fseek(fp,0,SEEK_END);
if(ret ==-1){
printf("fseek err\n");
return -3;
}
##int fseek(long offset, FILE *fp);
int fseek(FILE *stream, long offset, int whence);
whence: SEEK_SET 从头部开始衡量,offset >=0
SEEK_CUR 从当前位置衡量 offset 可正可负
SEEK_END 从尾部开始衡量,offset<=0
返回值:0-success -1:failed
9、获取文件偏移量
long offset = ftell(fp);
printf("fp offset %ld\n",offset);
获取当前文件的位置: 相对于头部偏移量
long ftell( FILE *fp );
返回值: >=0 success
-1: failed