* 库函数和系统调用的区别在于系统调用能够让你直接访问Linux内核提供的服务,比如前面学到的read、write函数就是基于系统调用的函数。
* 系统调用函数存在与内核空间,库函数都是用户模式,所以系统调用不当可能会破坏系统,但库函数调用风险就要小很多。
* 库函数堆I/O操作进行缓冲,减少了系统调用开销,同时可移植行也更好。
* 打开和关闭文件
FILE *p fopen(const char *path,const char *mode);
int fclose(FILE *stream);
* fopen以mode模式打开名为path的文件
* fopen返回一个文件指针
* 出现错误,fopen返回NULL,并把errno设置为恰当值。
* 参数 mode 指向一个字符串,以下列序列之一开始 (序列之后可以有附加的字符):
r 打开文本文件,用于读。流被定位于文件的开始。
r+ 打开文本文件,用于读写。流被定位于文件的开始。
w 将文件长度截断为零,或者创建文本文件,用于写。流被定位于文件的开始。
w+ 打开文件,用于读写。如果文件不存在就创建它,否则将截断它。流被定位于文件的开始。
a 打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。流被定位于文件的末尾。
a+ 打开文件,用于追加(在文件尾写)。如果文件不存在就创建它。读文件的初始位置是文件的开始,但是输出总是被追加到文件的末尾。
* 如果把Linux中二进制文件转到Windows上需要更改参数,在后面加一个b
“rb”
打开一个用于读取的二进制文件
“wb”
创建一个用于写入的二进制文件
“ab”
附加到一个二进制文件
“rb+”
打开一个用于读/写的二进制文件
“wb+”
创建一个用于读/写的二进制文件
“ab+”
打开一个用于读/写的二进制文件
* 读写文件
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream);
* 参数pty指向缓冲区保存或读取的数据
* 参数size控制记录大小,每次读取数据的大小
* 参数nmemb为记录数
* 函数返回读取或回写的记录数,1/0
* fread函数分析
FILE *p=fopen("a.txt","r+");
if(p==NULL)
{
printf("error is %s",strerror(errno));
}
else
{
printf("SUCCESS\n");
char buf[100];
memset(buf,0,sizeof(buf));
size_t rc=fread(buf,sizeof(buf),1,p);//1是记录数,可以是2、3、4、5...
//可以这样理解,我每次读取一条记录,这条记录的大小是sizeof(buf)
while(1)
{
size_t tmp=fread(buf,1,10,p);//第二个参数表示每次读取记录的大小,读一个字节
//第三个参数表示每次读取多少记录行,读10个记录行
//返回的是每次读取的记录行,到文件最后没有把10行记录行读满,则返回所读的记录行
rc+=tmp;
if(tmp== 0)
break;
}
fclose(p);
}
二进制读取文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
struct person
{
int id;
char name[20];
int age;
int sex;
char tel[20];
};
int Write(void)
{
char path[20] = "1.txt";
FILE *p = fopen(path, "w");//在windows下读取二进制文件,则文件读写方式符为wb\rb
if (p == NULL)
{
printf("error is %s", strerror(errno));
}
else
{
printf("SUCCESS\n");
struct person MEN[20];
memset(&MEN, 0, sizeof(MEN));
MEN[0].age = 22;
strcpy(MEN[0].name, "苍老师");
MEN[0].age = 19;
MEN[0].sex = 0;
strcpy(MEN[0].tel, "100");
MEN[1].age = 19;
strcpy(MEN[1].name, "饭岛爱");
MEN[1].age = 19;
MEN[1].sex = 0;
strcpy(MEN[1].tel, "101");
fwrite(&MEN, sizeof(struct person), 2, p);
fclose(p);
}
return 0;
}
int Read(void)
{
char path[20] = "1.txt";
FILE *p = fopen(path, "r");
if (p == NULL)
{
printf("error is %s\n", strerror(errno));
}
else
{
printf("Read Success\n");
struct person man;
while (1)
{
size_t a = fread(&man, sizeof(struct person), 1, p);
if (a == 0)
break;
printf("名字:%s\n年龄:%d\n电话:%s\n", man.name, man.age,man.tel);
}
fclose(p);
}
return 0;
}
int main(void)
{
Read();
return 0;
}