linux 文件 基本使用

1. 概述:
该demo主要实现linux下文件的基本操作, linux系统调用, 以及标准IO调用, 相关接口介绍可以参考<<UNIX环境高级编程>>
在这里插入图片描述在这里插入图片描述

2. 测试:
在这里插入图片描述

/*
demo_file_open.c
文件编程demo(linux系统调用)
基本操作 : 创建, 打开, 关闭, 读写, 文件偏移量, 文件同步, 权限判断, 文件删除

*/
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

#define MAX_BUF         64

#define FILENAME        "./test_open.txt"

int main(int argc, char **argv){

    int ret = -1;
    int fd = -1;
    char buf[MAX_BUF];

    /*
    创建文件
    fd = creat(FILENAME, 700);
    */

    /*
    fd : STDIN_FILENO/0(标准输入) STDOUT_FILENO/1(标准输出) STDERR_FILENO/2(标准错误)
    O_CREAT    : 若此文件不存在, 则创建它
    O_RDWR     : 可读可写方式打开
    O_RDONLY   : 只读方式打开
    O_WRONLY   : 只写方式打开
    O_APPEND   : 追加
    O_NONBLOCK : 非阻塞I/O
    */
    fd = open(FILENAME, O_CREAT | O_RDWR | O_APPEND, 700);
    if(fd < 0){
        /*printf("open:%s\n", strerror(errno));*/
        perror("open:");
        return -1;
    }

    /*
    F_OK : 判断文件是否存在
    X_OK : 判断对文件是否可执行权限
    W_OK : 判断对文件是否有写权限
    R_OK : 判断对文件是否有读权限
    */
    if(access(FILENAME, F_OK | W_OK | R_OK) < 0){
        perror("access:");
        goto err;
    }

    memset(buf, 0x0, sizeof(buf));
    memcpy(buf, FILENAME, strlen(FILENAME));
    if(write(fd, buf, strlen(buf)) < 0){
        perror("write:");
        goto err;
    }

    /*
    SEEK_SET : 参数offset即为新的读写位置
    SEEK_CUR : 以目前的读写位置往后增加offset个位移量
    SEEK_END : 将读写位置指向文件尾后再增加offset个位移量
    返回值 : 若成功, 返回新的文件偏移量(可用于计算文件大小)
    */
    if(lseek(fd, 0, SEEK_SET) < 0){
        perror("lseek:");
        goto err;
    }

    printf("buf = ");
    while(1){
        memset(buf, 0x0, sizeof(buf));
        ret = read(fd, buf, sizeof(buf));
        if(ret < 0){
            perror("read:");
            break;
        }
        else if(ret == 0){
            break;
        }

        printf("%s", buf);
    }
    printf("\n");

    fsync(fd);
    close(fd);
    //sync();
    //unlink(FILENAME);
    return 0;

err:
    fsync(fd);
    close(fd);
    //sync();
    //unlink(FILENAME);
    return -1;
}
/*
demo_file_fopen.c.c
文件编程demo(标准IO调用)
基本操作 : 打开/创建, 关闭, 二进制IO读写, 文件偏移量, 文件同步

*/
#include<unistd.h>
#include <string.h>
#include <stdio.h>

#define MAX_BUF         64

#define FILENAME        "./test_fopen.txt"

int main(int argc, char **argv){

    int ret = -1;
    FILE * fp = NULL;
    char buf[MAX_BUF];

    /*
    FILE * file : 标准输入(stdin) 标准输出(stdout) 标准错误(stderr)
    r(read) : 读
    w(write) : 写
    a(append) : 追加, 若文件不存在, 则会建立该文件
    t(text) : 文本文件
    b(banary) : 二进制文件
    + : 读和写
    */
    fp = fopen(FILENAME, "a+");
    if(fp == NULL){
        /*printf("fopen:%s\n", strerror(errno));*/
        perror("fopen:");
        return -1;
    }

    /*
    二进制IO读写
    */
    memset(buf, 0x0, sizeof(buf));
    memcpy(buf, FILENAME, strlen(FILENAME));
    if(fwrite(buf, strlen(buf), 1, fp) < 0){
        perror("fwrite:");
        goto err;
    }

    /*
    SEEK_SET : 文件的开头
    SEEK_CUR : 文件指针的当前位置
    SEEK_END : 文件的末尾
    */
    if(fseek(fp, 0, SEEK_SET) < 0){
        perror("fseek:");
        goto err;
    }

    printf("buf = ");
    while(1){
        memset(buf, 0x0, sizeof(buf));
        ret = fread(buf, sizeof(buf), 1, fp);
        if(ret < 0){
            perror("fread:");
            break;
        }
        else if(ret == 0){
            printf("%s", buf);
            break;
        }

        printf("%s", buf);
    }
    printf("\n");

    fflush(fp);
    fclose(fp);
    sync();
    return 0;

err:
    fflush(fp);
    fclose(fp);
    sync();
    return -1;
}
#Makefile
CC := gcc
INCLUDE = -I /home/demo/include/

all:
	$(CC) demo_file_open.c $(INCLUDE) -o demo_file_open -Wall -Werror
	$(CC) demo_file_fopen.c $(INCLUDE) -o demo_file_fopen -Wall -Werror

clean:
	rm demo_file_open demo_file_fopen
发布了12 篇原创文章 · 获赞 16 · 访问量 1735

猜你喜欢

转载自blog.csdn.net/lpaim/article/details/105496641
今日推荐