汇总一下这些IO的函数的原型、例子、功能以及返回值,真的有些很容易混淆,记录学习,后续的函数慢慢全部汇总在这篇笔记里,以巩固自己的基础
目录
1、fopen介绍
函数原型:
FILE *fopen(const char *pathname, const char *mode);
例子:
FILE *fp = fopen("./text.txt","r");
功能:以指定的方式打开一个给定的文件,并返回该文件的文件地址
返回值:成功调用返回打开的文件地址,失败返回NULL,并置位错误码
2、fclose介绍
函数原型:
int fclose(FILE *stream);
例子:
fclose(fp);
功能:关闭给定的文件指针
返回值:成功返回0,失败返回EOF,并置位错误码
3、fgetc介绍
函数原型:int fgetc(FILE *stream);
例子:
char buf = 0;
buf = fgetc(fp);
功能:从指定文件中,读取一个字符
返回值:从文件中读取的第一个字符的ascii值,失败返回EOF并置位错误码
4、fputc介绍
函数原型:
int fputc(int c, FILE *stream);
例子:
fputc('H', fp);
功能:将给定的字符,写入到文件指针stream指向的文件中去
返回值:成功返回写入字符的ascii值,失败返回EOF,并置位错误码
5、fgets介绍
函数原型:
char *fgets(char *s, int size, FILE *stream);
例子:
char buf[128] = "";
bzero(buf, sizeof(buf));
fgets(buf, sizeof(buf);
功能:从stream所指向的文件中,最多读取size-1的字符到s中,在读取过程中,如果遇到回车或者文件结束,会结束本次读取,并且会把回车也放入容器中。在后面自动加上'\0'
返回值:成功返回容器的起始地址,失败返回NULL
6、fputs介绍
函数原型:
int fputs(const char *s, FILE *stream);
例子:
fputs("Hello world\n", fp);
功能:将给定的字符串,写入到文件中
返回值:成功返回写入的字符个数(字符串长度),失败返回EOF
7、sprintf介绍
函数原型:
int sprintf(char *str, const char *format, ...);
例子:
char buffer[50];
int num = 123456;
sprintf(buffer, "The number is: %d", num);
printf("%s\n", buffer); // 输出: The number is: 123456
功能:将格式串转换为字符串放入字符数组中
返回值:成功返回转换的字符个数,失败返回-1
8、snprintf介绍
函数原型:
int snprintf(char *str, size_t size, const char *format, ...);
例子:
char buffer[100];
int num = 12345;
snprintf(buffer, sizeof(buffer), "The number is %d", num);
printf("%s\n", buffer); //输出The number is 12345
功能:将格式串转换为字符串放入字符数组中,该函数比sprintf更加安全,因为多了一个size的限制
返回值:成功返回转换的字符个数,失败返回-1
9、fprintf介绍
函数原型:
int fprintf(FILE *stream, const char *format, ...);
例子:
fprintf(fp ,"%d\n", num); //向fp指向的文件中输出
功能:向指定文件中写入一个格式串
返回值:成功返回写入文件的字符实际个数,失败返回-1
10、fscanf介绍
函数原型:
int fscanf(FILE *stream, const char *format, ...);
例子:
int key = 0;
fscanf(fp, "%d", &key); //从文件中读取一个数据
printf("key = %d\n", key); //在终端输出从文件中取出的key值
功能:将从文件中读取一些数据,放入到程序中来
返回值:成功返回读取数据的个数,失败返回EOF并置位错误码
11、fread介绍
函数原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
例子:
char rbuf[16] = ""; //要读取的内容
int res = fread(rbuf, 1, sizeof(rbuf), fp);
fwrite(rbuf, 1, res, stdout); //向标准输出写入内容
功能:存储在 ptr
指向的内存位置。每次调取size
大小的 nmemb
个 元素。从指定的文件流 stream
中读取数据
返回值:成功返回成功读取的元素数量 nmemb
。失败返回0
注意:fread并不能区分是文件结束了,还是因为出现错误了,需要使用feof或ferror来区分
12、fwrite介绍
函数原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
例子:
//准备字符串写入文件
char buf[] = "hello a\n";
fwrite(buf, 1, strlen(buf), fp); //单字符写入
fwrite(buf, strlen(buf), 1, fp); //单字串写入
功能:将 ptr
指向的数据,总共写入size
大小的 nmemb
个 元素。写入到 stream
指定的文件流中。
返回值:成功返回成功写入的元素数量 nmemb
。失败返回0
标记:以下为文件IO部分的函数
1、open介绍
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
例子:
//创建一个文件描述符变量,用于存储文件描述符
int fd = -1;
if((fd = open("./file.txt", O_WRONLY|O_CREAT|O_TRUNC, 0664)) == -1)
{
perror("open error");
return -1;
}
printf("open success fd = %d\n", fd);
/*
参数1:要打开的文件路径
参数2:文件打开标识
必须包含以下三者之一:
O_RDONLY:以只读的形式打开文件
O_WRONLY:以只写的形式打开文件
O_RDWR:以读写的形式打开文件
以下的可以选择性加入,使用位或完成:
O_CREAT:如果文件存在,就直接打开,如果文件不存在,则创建文件,此时,参数3必须要加,表示创建的文件权限
O_TRUNC:表示清空文件内容
O_APPEND:以追加的形式打开文件
O_EXCL:确保打开的是不存在的文件,通常跟O_CREAT一起使用,表示本次操作必须创建新文件,如果文件存在,则open函数报错,错误码为:EEXIST
*/
功能:以指定的方式打开指定的文件
返回值:成功返回一个新的文件描述符,失败返回-1并置位错误码
2、close介绍
函数原型:
int close(int fd);
例子:
if(close(fd) == -1)
{
perror("close fd 1");
return -1;
}
功能:关闭文件描述符
返回值:成功返回0,失败返回-1并置位错误码
3、read介绍
函数原型:
ssize_t read(int fd, void *buf, size_t count);
例子:
char temp; //用于接受数据的容器
read(fd, &temp, sizeof(temp));
功能:从指定的文件中读取count个字节的数据到buf中
返回值:成功返回读取字节的个数,失败返回-1并置位错误码
4、write介绍
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
例子:
char s[3] = {'1','2','3'};
write(fd, s, sizeof(s));
功能:向指定的文件fd中,写入指定的信息,从s里面读取sizeof(s)个数据
返回值:成功返回写入字符的个数,失败返回-1并置位错误码
5、lseek光标偏移函数介绍
函数原型:
off_t lseek(int fd, off_t offset, int whence);
例子:
lseek(fd, 2, SEEK_SET); //光标从头开始向右偏移2
/*
参数1:文件描述符
参数2:偏移量
>0:向后偏移
=0:不偏移
<0:向前偏移
参数3:偏移起始位置
SEEK_SET:文件开头
SEEK_END:文件结尾
SEEK_CUR:文件当前位置
*/
功能:移动文件的光标
返回值:成功返回文件光标当前的位置,失败返回-1并置位错误码
6、dup介绍
函数原型:
int dup(int oldfd);
例子:
//生成新的fd2文件描述符,但是与旧的文件描述符共享同一个光标
int fd2 = dup(fd1);
printf("fd1 = %d, fd2 = %d\n", fd1, fd2); //3 4
功能:贝旧文件描述符,生成新的文件描述符
返回值:新文件描述符
7、dup2介绍
函数原型:
int dup2(int oldfd, int newfd);
例子:
//定义变量存储文件描述符,fd1和fd2还是原来的文件描述符,但是现在会共享同一个光标
dup2(fd1 ,fd2); //原本的就是fd1=4 fd2=3
printf("fd1 = %d, fd2 = %d\n", fd1, fd2); //fd1=4 fd2=3
功能:拷贝旧文件描述符,放入新文件描述符中,如果新文件描述符之前已经打开,则在拷贝时,默认将其关闭
返回值:成功返回新文件描述符,失败返回-1并置位错误码
8、stat文件属性函数
函数原型:
int stat(const char *pathname, struct stat *statbuf);
例子:
//参数1:要获取的文件名
//参数2:文件属性结构体指针,是一个地址传递,需要传递一个结构体变量的地址,通过函数调用结束后,该变量中就有内容了
#include<myhead.h>
int main(int argc, const char *argv[])
{
//判断外部传来的文件
if(argc != 2)
{
printf("input file error\n");
return -1;
}
//定义接受文件的属性结构体变量
struct stat sb; //stat buf
//调用函数,获取文件状态
if(stat(argv[1], &sb) == -1)
{
perror("stat error");
return -1;
}
//程序执行至此,sb中就记录了传入的文件的信息
//输出文件类型
switch(sb.st_mode & S_IFMT)
{
case S_IFSOCK:
{
printf("套接字文件\t");
}
break;
case S_IFLNK:
{
printf("链接文件\t");
}
break;
case S_IFREG:
{
printf("普通文件\t");
}
break;
case S_IFBLK:
{
printf("块设备文件\t");
}
break;
case S_IFDIR:
{
printf("目录文件\t");
}
break;
case S_IFCHR:
{
printf("字符设备文件\t");
}
break;
case S_IFIFO:
{
printf("管道文件\t");
}
break;
}
//输出文件权限
printf("%#o\t", sb.st_mode&0777);
//输出文件大小
printf("%ld\t", sb.st_size);
//输出文件inode号
printf("%ld\n", sb.st_ino);
return 0;
}
功能:获取给定的文件状态属性
返回值:成功返回0,失败返回-1并置位错误码
注意点:1、使用st_mode & S_IFMT可以得到文件的类型
2、使用st_mode & 0777可以得到文件的权限