LINUX C系统编程学习笔记-----------文件编程

文件编程  

一.系统调用~~创建

int creat (const char *filename, mode_t mode);

filename:即要创建的文件名(包含路径,缺省为当前路径)

mode:创建模式

常见的模式:

S_IRUSR       可读

S_IWUSR     可写

S_IXUSR     可执行

S_IRWXU     可读,写,执行 

还可以用数字表示:

4 代表可读 

2 代表可写

1 代表可执行

7 代表可读,写,执行

例: 

#incldue <stdio.h> 

#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 <stdio.h>
#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 <stdio.h>
#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);


欢迎各位大神指正批评 ·········

posted @ 2012-06-26 10:50  xss  阅读(509)  评论(0编辑  收藏  举报