文件编程
一.系统调用~~创建
int creat (const char *filename, mode_t mode);
filename:即要创建的文件名(包含路径,缺省为当前路径)
mode:创建模式
常见的模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IRWXU 可读,写,执行
还可以用数字表示:
4 代表可读
2 代表可写
1 代表可执行
7 代表可读,写,执行
例:
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void creat_file(char *filename)
{
if (creat(filename,0755) < 0)
{
printf("Creat file %s failure!\n",filename);
exit(EXIT_FAILURE);
}
else
{
printf("Creat file %s success!\n",filename);
}
}
void main(int argc,char *argv[])
{
int i;
if (argc < 2)
{
perror("You haven't input the filename.please try again!\n");
exit(EXIT_FAILURE);
}
for (i = 1;i < argc;i++)
{
creat_file(argv[i]);
}
exit(EXIT_SUCCESS);
}
代码编译环境:
系统:Rad Hat 5
编译器:GCC 4.1.2
(以后代码不特意说明都是同样的编译环境)
二.系统调用~~打开
1. int open(const char *pathname, int flags);
2. int open(const char *pathname, int flags,mode_t mode);
pathname: 要打开的文件名(包含路径,缺省为当前路径)
flags:打开文件的标志
常见的打开标志:
O_DONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR 读写方式打开
O_APPEND 追加方式打开
O_CREAT 创建一个文件(当要打开的文件不存在的时候)
O_NOBLOCK 非阻塞的方式打开------------------------(这个到现在还不是很明白什么是非阻塞,希望得到大牛指点一下)
注意:
使用O_CREAT标志,需要使用第二种函数 这个函数中的第三个参数是说明要建立什么样的文件
例:
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;
if (argc < 2)
{
puts("Please input the open file pathname!\n");
exit(1);
}
if ((fd = open(argv[1],O_CREAT|O_RDWR,0755)) < 0)
{
perror("Open file failure!\n");
exit(1);
}
else
{
printf("Open file %d success!\n",fd);
}
close(fd);
exit(0);
}
三.系统调用~~关闭
int close(int fd);
fd:文件描述符(打开文件时,系统分配的一个标志符)
例子: 上面已经用到了
四.系统调用~~读
int read(int fd,const void *buf,size_t length);
从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。
五.系统调用~~写
int write(int fd,const void *buf ,size_t length);
把length个字节从buf指向的缓冲区中写入到文件描述符fd指向的文件中,返回值为实际写入的字节数。
六.系统调用~~定位
int lseek(int fd,offset_t offset,int whence);
将文件读写指针相对whence移动offset个字节,操作成功时,返回文件指针相对于文件头的位置,whence可使用如下值:
SEEK_SET 相对文件开头
SEEK_CUR 相对文件读写指针的当前位置
SEEK_END 相对文件末尾
offset可取负值,表示想前移动,如: lseek(fd,-5,SEEK_CUR)表示将文件指针相对当前位置向前移动5个字节
用lseek(fd,0,SEEK_END)可以测文件的长度,因为其返回值就是相对于文件头的位置。
七.系统调用~~访问判断
int access(const chat * pathname,int mode);
pathname:文件名称
mode:要判断的访问文件权限,可以 取以下值或是他们的组合,R_OK:文件可读,W_OK:文件可写。X_OK:文件可执行,F_OK:文件存在
返回值:当我们测试成功时,函数返回0,负责如果一个条件不符,返回-1
八.综合实例 ~~copy程序
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFFER_SIZE 1024
int main(int argc,char *argv[])
{
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if (argc != 3)
{
fprintf(stderr,"Usage: %s fromfile tofile\n\a",argv[0]);
exit(1);
}
// 打开源文件
if ((from_fd = open(argv[1],O_RDONLY))== -1)
{
fprintf(stderr,"Open %s Error: %s\n",argv[1],strerror(errno));
exit(1);
}
//创建目的文件
if ((to_fd = open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) == -1)
{
fprintf(stderr,"Open %s Error : %s\n",argv[2],strerror(errno));
exit(1);
}
// 经典的拷贝代码———这个真的很经典
while (bytes_read = read(from_fd,buffer,BUFFER_SIZE))
{
if ((bytes_read == -1) && (errno != EINTR))
break;
else if (bytes_read > 0)
{
ptr = buffer;
while (bytes_write = write(to_fd,ptr,bytes_read))
{
if ((bytes_write == -1) && (errno != EINTR))
break;
else if (bytes_write == bytes_read)
break;
else if (bytes_write > 0)
{
ptr += bytes_write;
bytes_read -= bytes_write;
}
}
if (bytes_write == -1)
break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
欢迎各位大神指正批评 ·········