Linux 文件管理(系统函数)

//read函数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

/*
 STDIN_FILENO:标准输入,值是0
 STDOUT_FILENO:标准输出,值是1
 STDERR_FILENO:标准错误,值是2
 头文件是 unistd.h

read(文件标识符,缓冲区,缓冲区大小)函数是从某个文件中读取缓冲区大小的数据
ssize_t read(int fd, void *buf, size_t count);
read()函数的返回值是输入字符的个数+1(+1是因为系统会为输入的字符串加上'\0') read()相比于scanf()优势在于read()可以读取空格,而scanf()遇到空格结束 但是read不能将数字字符串直接转化成int型,需要调用atoi()函数
read()函数可以读取键盘上输入的每个字符包括回车换行 atoi()函数的头文件是stdlib.h,功能是将字符串转成数字
*/ int main(int arg,char *args[]) { char buf[50]={0}; int numx=0; int index=read(STDIN_FILENO,buf,sizeof(buf)); printf("返回值是%d,输入字符串是%s\n",index,buf); numx=atoi(buf); printf("输入的数字是%d\n",numx); return 0; }

 

//write函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*
ssize_t write(int fd, const void *buf, size_t count);
write()函数的返回值是写入字符串的大小(不包含'\0') write()函数向指定文件标识符输出缓冲区数据
*/ int main(int arg,char *args[]) { char buf[50]={0}; strcpy(buf,"fly with you!\n"); int index=write(STDOUT_FILENO,buf,strlen(buf)); printf("返回值是%d,\n",index); return 0; }

 

//open函数|close()函数
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

/*
 int open(const char *pathname, int flags);
Opne试图打开参数pathname中的一个文件。
参数flags指定访问该文件的方式。
必须把flags设置为O_RDONLY,O_WRONLY,O_RDWR,O_CREAT,O_APPEND分别表示只读、只写、读写、如果文件存在就创建、追加。
open成功后会返回一个文件描述符。
open失败后会返回-1,并设置errno变量

 errno是int型,表示错误编号,头文件是errno.h
 strerror()函数是打印错误信息,头文件是string.h
 */

int main(int arg,char *args[])
{
    if(arg<2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    int fd=open(args[1],O_RDONLY);
    if(fd==-1)
    {
        printf("错误信息:%s\n",strerror(errno));
    }else
    {
        printf("文件标识符是%d\n",fd);
        char buf[100]={0};
        //读取当前文件的内容
        read(fd,buf,sizeof(buf)-1);
        printf("%s\n",buf);
        close(fd);
    }
    return 0;
}

 

使用fstat函数获取文件信息。
int fstat(int fd,struct stat *buf)
参数fd必须使用open()函数调用返回的有效文件描述符
使用stat函数获取文件信息
int stat(const char *path,struct stat *buf)
参数path是路径加文件名的字符串

结构体stat
struct stat
{
    dev_t st_dev;         /*ID of device containing file*/
    ino_t st_ino;         /*inode number*/
    mode_t st_mode;       /*protection*/
    nlink_t st_nlink;     /*numbers of hard links*/
    uid_t st_uid;         /*user ID of owner*/
    gid_t st_gid;         /*group ID of owner*/
    dev_t st_rdev;        /*device ID (if special file)*/
    off_t st_size;        /*total size,in bytes*/
    blksize_t st_blksize; /*blocksize for filesystem I/O*/
    blkcnt_t st_blocks;   /*number of 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*/
};


为了正确解释文件类型,有一套宏能够计算stat借口的st_mode成员。
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic lin?(Not in POSIX.1-1996)
S_ISSOCK(m) socket?(Not in POSIX.1-1996)
/* fstat函数使用示例 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>

void test()
{
    int         ret = 0;
    struct stat buffer;
    int         fd;

    // 1.参数校验

    do 
    {
        // 初始化
        // 注意 struct stat 结构体可以以这种方式初始化
        memset(&buffer, 0, sizeof(struct stat));

        // 2.打开文件
        fd = open("./1.bin", O_RDWR);
        if (fd < 0)
        {
            printf("open error\n");
            break;
        }

        // 3.获取文件状态
        ret = fstat(fd, &buffer);
        if (ret)
        {
            printf("fstat error\n");
            break;
        }

        // 4.打印文件大写
        printf("file size %ld\n", buffer.st_size);

    } while (0);

    // 释放资源
    if (fd > 0)
    {
        close(fd);
    }

}

int main()
{
    test();
    return 0;
}
//fstat()函数
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(int arg,char *args[])
{
    if(arg<2)
    {
        printf("请输入一个参数!\n");
        return 0;
    }
    //open file
    /*
       备注:如果是以追加的方式打开文件,必须使用 O_RDWR|O_APPEND;单独的是O_APPEND没有效果!
     */
    int fd=open(args[1],O_RDONLY);
    //Judgment file identifier
    if(fd==-1)
    {
        printf("error msg:%s\n",strerror(errno));
    }else
    {
        printf("file identifier:%d\n",fd);
        //define struct stat
        struct stat buf;
        //get file stat
        fstat(fd,&buf);
        //judge file tyep
        if(S_ISREG(buf.st_mode))
        {
            printf("this is regular file!\n");
        }else if(S_ISDIR(buf.st_mode))
        {
            printf("this id directory!\n");
        }
        //show file size
        printf("file size:%d\n",buf.st_size);
        //close file
        close(fd);
    }
    return 0;
}

 

getpass()函数
读写用户输入,屏幕不回显(一般用于输入密码不显示)
char * getpass(const char * prompt);
getpass用于从键盘读取用户输入,但屏幕不回显。
参数prompt为屏幕提示字符。
函数返回值为用户键盘输入字符串 

 

//getpass()函数的使用
#include <stdio.h>
#include <unistd.h>

int main(int arg,char *args[])
{
    char *s=getpass("input password:");
    printf("your password :%s\n",s);
    return 0;
}

 

posted on 2016-08-20 21:34  寒魔影  阅读(511)  评论(0编辑  收藏  举报

导航