写程序思路 、C语言 文件IO

写程序思路:

在用到某个函数的时候:
1.可以先使用命令man -f 函数名 查看是第几本(一般man1为命令 所一是man2或者是man3)
2.或者查阅资料《LINUX环境编程图文指南》和 linux_C函数库中文手册

文件IO

====================================================================
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
参数分析:
参数 pathname —指向欲打开的文件路径字符串.
下列是参数 flags 所能使用的旗标:

 O_RDONLY ----以只读方式打开文件
 O_WRONLY ---以只写方式打开文件
 O_RDWR ---以可读写方式打开文件. 

参数mode_t mode:

O_CREAT ----若欲打开的文件不存在则自动建立该文件.
 O_EXCL ----如果 O_CREAT 也被设置, 此指令会去检查文件是否存在. 文件若不存在则建立该
    文件, 否则将导致打开文件错误.
 O_NOCTTY ----如果欲打开的文件为终端机设备时, 则不会将该终端机当成进程控制终端机.
 O_TRUNC ---若文件存在并且以可写的方式打开时, 此旗标会令文件长度清为 0, 而原来存于该
     文件的资料也会消失.
 O_APPEND ---当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文
      件后面.

返回值:
若所有欲核查的权限都通过了检查则返回 0 值, 表示成功, 只要有一个权限被禁止则返回-1.

====================================================================

函数原型:
ssize_t read(int fd, void * buf, size_t count);

头文件:
#include <unistd.h>

参数分析:

 fd ----所指文件
 buf ---指针所指的内存存放的内容
 count ----存放的内容的字节数

read()会把参数 fd 所指的文件传送 count 个字节到 buf 指针所指的内存中. 若参数 count 为 0, 则
read()不会有作用并返回 0. 返回值为实际读取到的字节数, 如果返回 0, 表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动.
返回值:
为实际读取的字节数

====================================================================

函数原型:
ssize_t write(int fd, const void *buf, size_t count);

头文件:
#include <unistd.h>

参数分析:
write()会把参数 buf 所指的内存写入 count 个字节到参数 fd 所指的文件内. 当然, 文件读写位置也会随之移动.

返回值:
如果顺利 write()会返回实际写入的字节数. 当有错误发生时则返回-1, 错误代码存入 errno 中.

====================================================================

目录检索
1.打开目录文件(Linux下一切皆文件):

函数原型:
DIR *opendir(const char *name);

头文件:
#include <sys/types.h>
#include <dirent.h>

参数分析:
opendir()用来打开参数 name 指定的目录, 并返回 DIR*形态的目录流, 和 open()类似, 接下来对
录的读取和搜索都要使用此返回值.

返回值:
成功则返回 DIR* 型态的目录流, 打开失败则返回 NULL.

2.读取目录文件:

函数原型:
struct dirent * readdir(DIR * dir);

头文件:
#include <sys/types.h>
#include <dirent.h>

函数说明:
readdir()返回参数 dir 目录流的下个目录进入点.
结构 dirent 定义如下

struct dirent
{
	  ino_t d_ino; //d_ino 此目录进入点的 inode
	  ff_t d_off; //d_off 目录文件开头至此目录进入点的位移
	  signed short int d_reclen; //d_reclen _name 的长度, 不包含 NULL 字符
	  unsigned char d_type; //d_type d_name 所指的文件类型 d_name 文件名
	  har d_name[256];
};

返回值:
成功则返回下个目录进入点. 有错误发生或读取到目录文件尾则返回 NULL.

3.通过文件名来识别文件类型(后缀)

举例:

while(1)
 {
	  struct dirent *fd_info = readdir(&dir)
	  //每次读取都返回下一个节点目录,为NULL即为读取到目录末尾
	  if(NULL == fd_info)
	  {
	   	break;
	  }
	  //字符串匹配,成功返回匹配所在子串位置,失败返回NULL
	  if(strstr(fd_info->d_name,".***"))
	  {
	   	sprintf(pathname[cont++],"./%s",fd_info->d_name);
	  }
}

注意: char pathname[20][50] 定义后的pathname[i]的值不确定,不能以NULL判断!!
解决方案: 只能在赋值时向函数传参数告诉数组行数作为结束。
char (*pathname)[50] 定义后的pathname 并没有内存空间。

====================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值