Linux系统编程:简单文件IO操作(2)

//读取文件
    int count = 0;
    char buf[41];
    count = read( fd, buf, 38 );
    if ( -1 == count ) {
        printf("文件读取失败\n");
    }else {
        printf("文件读取成功,实际读取的字节数目为:%d\n内容为%s\n", count, buf );
    }

//关闭文件
    close( fd );

return 0;
}

2,清空与追加

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char const *argv[]) {

int fd = -1; //文件描述符

//打开文件
    //在O_RDWR模式下,对于一个已经存在的文件,且有内容,那么写入文件会覆盖对应大小的源文件内容【不是完全覆盖】
    // fd = open( "ghostwu.txt", O_RDWR );
    //在具有写入权限的文件中,使用O_TRUNC 会先把原来的内容清除,再写入新的内容
    // fd = open( "ghostwu.txt", O_RDWR | O_TRUNC );
    //在具有写入权限的文件中,使用O_APPEND 会把新内容追加到原来内容的后面
    // fd = open( "ghostwu.txt", O_RDWR | O_APPEND );

//在具有写入权限的文件中,使用O_APPEND和O_TRUNC O_TRUNC起作用,会把原来的内容清除,再写入新的内容
    fd = open( "ghostwu.txt", O_RDWR | O_APPEND | O_TRUNC );

if ( -1 == fd ) {
        printf("文件打开失败\n");
        return -1;
    }else {
        printf("文件打开成功,fd=%d\n", fd );
    }

//写文件
    char buf[] = "new content";
    int count = 0;
    count = write( fd, buf, strlen( buf ) );
    if ( -1 == count ) {
        printf("文件写入失败\n");
        return -1;
    }else {
        printf("文件写入成功,实际写入的字节数目为:%d\n", count);
    }

//关闭文件
    close( fd );

return 0;
}

3,文件存在已否,创建文件与设置权限

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char const *argv[]) {

int fd = -1;

// fd = open( "ghostwu.txt", O_RDWR | O_CREAT | O_EXCL );

/*
        文件不存在:
            创建这个文件 并打开成功
        文件存在:
            再次运行时(文件已经创建成功,存在了), 这时打开失败
    */
    // fd = open( "ghostwu.txt", O_RDWR | O_CREAT );

fd = open( "ghostwu.txt", O_RDWR | O_CREAT | O_EXCL, 666 );

if( -1 == fd ) {
        printf("文件打开失败,错误号:%d\n", errno );
        perror( "open" );
        return -1;
    }else {
        printf("文件打开成功\n");
    }

close( fd );

return 0;
}

上面用到了一个函数perror,errno和perror:

1)errno就是error number,意思就是错误号码。linux系统中对各种常见错误做了个编号,当函数执行错误时,函数会返回一个特定的errno编号来告诉我们这个函数到底哪里错了

2)errno是由操作系统来维护的一个全局变量,操作系统内部函数都可以通过设置errno来告诉上层调用者究竟刚才发生了一个什么错误

3)errno本身实质是一个int类型的数字,每个数字编号对应一种错误。当我们只看errno时只能得到一个错误编号数字,并不知道具体错在哪里,所以:linux系统提供了一个函数perror(意思print error),perror函数内部会读取errno并且将这个不好认的数字直接给转成对应的错误信息字符串,然后打印出来

4,lseek用来移动文件内部指针

简单应用:统计文件大小

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char const *argv[]) {

if ( argc != 2 ) {
        printf("usage:%s %s\n", argv[0], "filename");
        return -1;
    }

int fd = -1;

fd = open( argv[1], O_RDWR );

if( -1 == fd ) {
        printf("文件打开失败,错误号:%d\n", errno );
        perror( "open" );
        return -1;
    }else {
        printf("文件打开成功\n");
    }

//把指针移动到文件末尾,就是文件的大小
    int count = lseek( fd, 0, SEEK_END );

printf("文件大小为%d\n", count);

close( fd );
    return 0;
}

------------------------------------------分割线------------------------------------------

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a4c0aac0c2f16e2aab3de9753a17a785.html