linux函数学习 标准io/文件o

标准 io 篇

1. fopen 文件打开

函数原形

#include 

FILE *fopen(const char *path, const char *mode); 
// const char* 保护实参不被修改

参数

  • path 文件名(包含路径:绝对路径或者相对路径)

  • mode 文件打开的方式

  • r 以只读方式打开 文件必须已存在

  • r+ 以读写方式打开 文件必须已存在

  • w 以只写方式打开 如果不存在 则创建并打开 存在则清空并打开

  • w+ 以读写方式打开 如果不存在 则创建并打开 存在则清空并打开

  • a 以追加写的方式打开 如果文件不存在 则创建并打开

  • a+ 以追加读写的方式打开 如果文件不存在 则创建并打开

  • 返回值 成功返回FILE* 类型指针(文件流指针) 失败返回NULL

示例程序

#include
#include//exit头文件
int main()
{
	FILE * fp=NULL;
	//只写的方式打开文件
	fp = fopen("first.txt","w");//调用
	if(NULL==fp)//#define NULL (void *)0
	{
		printf("文件打开失败\n");
		exit(-1);//退出整个程序
	}
	return 0;
}

tips

程序运行时 系统自动打开3个流

描述 类型 含义
stdin FILE * stdin 从标准输入取数据,默认是键盘
stdout FILE * stdout 向标准输出设备输出,默认是显示器
stderr FILE * stderr 向标准错误输出设备输出,默认是显示器

2. fclose 关闭文件

函数原型

#include 

int fclose(FILE *fp);// fclose(fp);
//功能:关闭文件 

3. perror 错误提示

函数原型

#include 

void perror(const char *s);
//功能:返回上一个函数的错误信息 
//参数:实际错误信息 

4. fgets 按行读取

函数原型

#include
	
char *fgets(char *s, int size, FILE *stream);
//功能:从文件中读取一行 

参数

  • s: 读取的数据存放的位置

  • size: 最多读多大 实际最多能读到的有效字符 size-1个字节

  • stream: 从stream文件中读取一行

  • 返回值: 成功 返回读到的数据 ,失败或者到文件结尾 返回NULL

备注
如果size < 行字节数,实际读取有效字符size - 1,剩下的字符需要循环读取 直到 ’\n’。
如果size > 行字节数,实际读到一行。(遇到 ’\n’ 停止)


6. fputs 向文件中写入一行数据

函数原型

#include

int fputs(const char *s, FILE *stream);
//功能:向文件中写入一行 

参数

  • s: 存放要写入文件的字符串
  • stream: 要写入的文件
  • 返回值: 成功:返回非负数。 失败:返回EOF //EOF是文件结束标志

示例程序

//存在文件 stu.txt (有内容),读取stu.txt内容,并将读到的内容写入note.txt

#include
#include
#include

//./mycp first.txt  note.txt
int main(int argc,char *argv[])
{
	//argc!=3  错误处理 
	if(argc!=3)
	{
		printf("%s 源文件名 目标文件名\n",argv[0]);
		exit(-1);
	}
	char buf[100]="\0";
	char *pret = NULL;
	//1.打开源文件 fpSrc   argv[1]  "r"
	FILE *fpSrc = fopen(argv[1],"r");
	if(NULL==fpSrc)
	{
		perror("fopenSrc");
		exit(-1);
	}
	//2.打开目标文件 fpDst  argv[2] "w"
	FILE * fpDst = fopen(argv[2],"w");
	if(NULL==fpDst)
	{
		perror("fopenDst");
		exit(-1);
	}
	//循环导数据
	while(1)
	{
		pret = fgets(buf,sizeof(buf),fpSrc);
		//错误处理 
		if(NULL==pret)
		{
			break;
		}
		fputs(buf,fpDst);	
		bzero(buf,sizeof(buf));
	}
	//3.关闭两个文件
	fclose(fpSrc);
	fclose(fpDst);
}

7. bzero 地址上数据清零

函数原型

#include 

void bzero(void *s, size_t n);
//功能:将地址s的前n个字节清零


8. fputc 写入一个字符

#include 

int fputc(int c, FILE *stream);
//功能:输出一个字符到文件 

参数

  • c: 要输出的字符
  • stream:文件
  • 返回值: 成功则返回写入的字符,失败返回EOF

示例程序

#include
#include

int main()
{
	FILE *fp = fopen("first.txt","w");
	if(NULL==fp)
	{
		perror("fopen");
		exit(-1);
	}
	//将字符'a'写入fp
	fputc('a',fp);
	char ch='x';
	fputc(ch,fp);
	fclose(fp);
	return 0;
}

9. fgetc 读取一个字符

函数原型

#include 

int fgetc(FILE *stream);
//功能:从文件中读取一个字符 

参数

  • stream:文件
  • 返回值: 成功则返回读到的字符 ,失败或到文件结尾返回EOF

示例程序

#include
#include
int main()
{
	FILE *fp = fopen("file.txt","r");//
	if(NULL==fp)
	{
		perror("fopen");
		exit(-1);
	}
	char ch;
	//从文件fp中读取一个字符 
	ch = fgetc(fp);//getchar();
	printf("%c",ch);
	while(1)
	{
		ch = fgetc(fp);//getchar();
		if(EOF==ch)
		{
			break;
		}
		printf("%c",ch);	
	}
	fclose(fp);
	return 0;
}

10. fread 按指定大小读

函数原型

#include 

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);// 10 
//功能:按指定大小读 任意类型 

参数

  • ptr:读取的数据存放的位置
  • size:每次读取的大小
  • nmemb:想读多少次
  • strem:从stream读取数据
  • 返回值:成功则返回实际读到的次数; 失败则此数字可能feof 函数判断是否到达文件结尾

示例程序

#include 
#include 

int main()
{
	FILE *fp = fopen("file.txt","r");
	if(NULL == fp)
	{
		perror("fopen");
		exit(-1);
	}
	int i;
	char buf[5] = "\0";
	//从文件fp读取数据存入buf,每次读1个字符,读取sizeof(buf)次
	fread(buf,1,sizeof(buf),fp);
	for(i = 0;i < 5;i++)
	{
		printf("%c",buf[i]);
	}
	return 0;
}

11. fwrite 指定大小写

函数原型

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//功能: 按指定大小写 

参数

  • ptr:要写入的数据存储的位置
  • size:每次写的大小
  • nmemb:写多少次
  • stream:写入的文件
  • 返回值:成功则返回实际写的次数,失败则返回 0

示例程序

#include 
#include 
#include 

int main()
{
	FILE *fp = fopen("first.txt","w");
	if(NULL = fp)
	{
		perror("fopen");
		exit(-1);
	}
	char buf[50] = "hello world";
	fwrite(buf,3,sizeof(buf),fp);
	//关闭文件
	fclose(fp);
	return 0;
}

12. feof 文件结束标识符

函数原型

#include 

int feof(FILE *stream);
//功能:测试文件位置指针是否到达文件结尾 

参数

  • stream:文件流指针
  • 返回值:如果到达文件结尾,则返回真,否则返回假

示例程序

#include 
#include 
#include 

int main()
{
	FILE *fp = fopen("test9.c","r");
	if(NULL == fp)
	{
		perror("fopen");
		exit(-1);
	}
	char buf[50] = "\0";
	//循环读取文件内容显示到屏幕
	while(1)
	{
		fread(buf,1,sizeof(buf),fp);
		printf("%s",buf);
		if(feof(fp))
		{
		break;
		}
		bzero(buf,sizeof(buf));
	}
	//关闭文件
	fclose(fp);
	return 0;
}

13. rewind 定位文件位置指针

函数原型

void rewind(FILE *stream);
 
//功能:将文件位置指针定位到文件的起始位置

参数

  • stream:定位stream文件的位置指针

示例函数

#include 
#include 
#include 

int main()
{
	FILE *fp = fopen("first.txt","w+");
	if(NULL == fp)
	{
		perror("fopen");
		exit(-1);
	}
	char buf[50] = "hello world";
	fwite(buf,3,sizeof(buf),fp);
	
	//将文件位置指针定位到文件起始位置
	rewind(fp);
	bzero(buf,sizeof(buf));
	fread(buf,1,sizeof(buf),fp);
	printf("read:%s\n",buf);
	
	//关闭文件
	fclose(fp);
	return 0;
}

14. fseek 定位文件位置指针

函数原型

#include 

int fseek(FILE *stream, long offset, int whence);
//功能:定位文件位置指针 

参数

  • stream:定位stream文件的位置指针
  • offset:偏移
  • whence:参照
  • SEEK_SET 文件起始位置 fseek(fp,2,SEEK_SET);//相对文件起始位置,向右偏移2个字节
  • SEEK_END 文件的末尾 fseek(fp,-2,SEEK_END);//相对文件末尾,向左偏移2个字节
  • SEEK_CUR 当前位置 fseek(fp,3,SEEK_CUR);//相对当前位置,向右偏移3个字节
  • 返回值:成功则返回0,失败则返回-1

15. ftell 返回当前文件位置指针的位置

函数原型

#include

long ftell(FILE *stream);
//功能:返回当前文件位置指针的位置(测试当前文件位置指针相对文件开头距离)  

示例

long n = ftell(fp);
printf("%ld\n",n);
return 0;

文件 io 篇

1. open 文件打开

函数原形

#include 
#include 
#include 

int open(const char *pathname, int flags, mode_t mode);
//功能: 打开或创建文件
		参数1:打开的文件的路径 包括文件名  路径:可以是绝对路径 也可以是相对路径
		参数2:打开文件的方式
		参数3:对新文件的访问权限    可有可无 如果参数2是O_CREAT 则参数3生效  
		返回值:成功返回文件描述符 失败-1

参数

  • pathname 打开的文件的路径(包含路径:绝对路径或者相对路径)
  • flags 打开文件的方式
  • mode 对新文件的访问权限,可有可无。如果参数2是O_CREAT,则参数3生效
  • 返回值 成功则返回文件描述符,失败则返回-1
flags参数类型
  • O_RDONLY 只读打开

  • O_WRONLY 只写打开

  • O_RDWR 读、写打开

  • 大多数实现将 O_RDONLY 定义为 0 ,O_WRONLY定义为 1 ,O_RDWR定义为 2

  • O_EXEC 只执行打开

  • O_SEARCH 只搜索打开

    上述 5 个常量中必须指定且只能指定一个。下列常量则是可选的。


  • O_APPEND 每次写时都追加到文件的尾端。
  • O_CREAT 如果文件不存在则创建,如果文件存在则打开。使用此选项时,open函数需同时说明第3个参数mode,用mode指定该新文件的访问权限位。
  • O_EXCL 测试文件是否存在,如果同时指定O_CREAT,而文件已经存在,则open返回错误信息。用此可以此时一个文件是否存在,如若不存在,则创建此文件。
  • O_DIRECTORY 如果path引用的不是目录,则出错。
  • O_NOCTTY 如果path引用的是终端设备,则不将该设备分配作为此进程的控制终端。
  • O_NOFOLLOW 如果path引用的是一个符号链接,则出错。
  • O_NONBLOCK 如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置为非阻塞方式。
  • O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志。
  • O_SYNC 使每次write等待物理I/O操作完成,包括由该write操作引起的文件属性更新所需的 I/O。
  • O_TRUNC 如果此文件存在,而且为只写或读-写成功打开,则将其长度截断为0。(清空文件内容)

2. 文件 tips

文件描述符

分配规则:当前尚未分配的最小的非负整数

  • 标准输入 ——键盘 0
  • 标准输出 ——显示器 1
  • 标准错误输出 ——显示器 2
文件属性 文件所有者 文件所属组 文件大小 文件创建时间 文件名
-rw-rw-r– 1 linux linux 90 Aug 4 01:22 create.c

文件类型

例:drwxrwxr-x
第一个字符代表文件类型

d 目录文件

目录文件 directory file。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读该目录的内容,但只有内核可以直接写目录文件。进程必须使用函数才能更改目录。

- 普通文件

普通文件 regular file。这是最常用的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。

c 字符设备文件

字符特殊文件 character special file。这种类型的文件提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。

l 链接文件

符号链接 symbolic link。这种类型的文件指向另一个文件。

b 块设备文件

快特殊文件 block special file。这种类型的文件提供对设备(如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。

s 套接字文件

套接字 socket。这种类型的文件用于进程间的网络通信。套接字也可用于在另一台宿主机上进程之间的非网络通信。

p 管道文件

FIFO。这种类型的文件用于进程间通信,有时也称为命名管道(named pipe)。


3. close 文件关闭

函数原型

#include 

int close(int fd);
//功能:关闭文件fd 

参数

  • 返回值 成功则返回0,失败则返回-1

4. write 写入

函数原形

#include 

ssize_t write(int fd, const void *buf, size_t count);
//功能:将数据写入文件

参数

  • fd 文件描述符
  • buf 数据首地址
  • count 写入数据的长度(字节)
  • 返回值 成功则返回实际写入的字节数,失败则返回-1。(ssize_t 为有符号整型)

5. read 读取

函数原形

#include 

ssize_t read(int fd, void *buf, size_t count);
//功能:从文件中读数据 

参数

  • fd 文件描述符
  • buf 数据首地址
  • count 写入数据的长度(字节)
  • 返回值 成功则返回实际写入的字节数,失败则返回-1。(ssize_t 为有符号整型)

6.lseek 设置文件偏移量

函数原型

#include 
#include 

off_t lseek(int fd, off_t offset, int whence);
//功能:为一个打开文件设置偏移量(文件位置指针定位) 

参数

  • fd 文件描述符
  • offset 偏移量(字节)
  • whence 偏移量参照
  • 返回值 成功则返回文件位置指针相对于文件起始位置的偏移,失败则返回-1
whence参数类型
  • SEEK_SET 将该文件的偏移量设置为距文件开始处offse个字节
  • SEEK_CUR 将该文件的偏移量设置为其当前值加offset个字节,offset可为正或负
  • SEEK_END 将该文件的偏移值设置为文件长度加offset个字节,offset可为正或负

文件和目录篇

1. opendir 打开目录流

函数原型

#include 
#include 

DIR *opendir(const char *name);
//功能:打开目录流

参数

  • name 要打开的目录,包括路径
  • 返回值 成功则返回目录流指针,失败则返回NULL

2. closedir 关闭目录

#include 
#include 

int closedir(DIR *dirp);
//功能:关闭目录   


3. readdir 读取目录

#include 
struct dirent *readdir(DIR *dirp);
//功能:读取目录 


参数

  • dirp 目录流指针
  • 返回值 成功则返回struct dirent类型指针,到达结尾或失败则返回NULL
struct dirent
 struct dirent 
 {
 ino_t          d_ino;       /* inode number */inode编号 文件编号
 off_t          d_off;       /* offset to the next dirent */
 unsigned short d_reclen;    /* length of this record */
 unsigned char  d_type;      /* type of file; not supported by all file system types */
 char           d_name[256]; /* filename */ 文件名
 };


4. stat 返回文件信息

函数原型

#include 
#include 
#include 

int stat(const char *path, struct stat *buf);//stat("a.txt",&s);
//功能:获取path文件属性 将其保存到buf 不能获取链接文件属性


参数

  • path: 文件名(含路径)
  • buf: 将参数path所指的文件状态,,复制到参数buf所指的结构中。buf是一个 stat 结构地址,stat 函数会在调用时自动填充该结构的内容
  • 返回值:成功则返回0,失败则返回-1
struct stat 结构定义
//定义于 /usr/include/sys/stat.h 文件中 
struct stat 
 {
 	dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */ inode 文件编号
    mode_t    st_mode;    /* protection */文件操作权限 文件类型
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */\\p00
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* total size, in bytes */ 文件大小
    blksize_t st_blksize; /* blocksize for file system I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};

*** tips***

stat用来判断没有打开的文件,我们使用最多的属性是st_mode。通过此属性我们可以判断给定的文件是一个普通文件还是一个目录、链接等等。可以使用下面几个宏来判断。

文件类型(符合返回真,否则返回假)
S_ISLNK(st_mode) 判断是否是一个连接
S_ISREG(st_mode) 判断是否是一个常规文件
S_ISDIR(st_mode) 判断是否是一个目录
S_ISCHR(st_mode) 判断是否是一个字符设备
S_ISBLK(st_mode) 判断是否是一个块设备
S_ISFIFO(st_mode) 判断是否是一个FIFO文件
S_ISSOCK(st_mode) 判断是否是一个SOCKET文件

你可能感兴趣的:(linux,学习,c语言)