Linux从入门到开发实战(C/C++)Day02-文件

点击前往Day03-目录

Linux文件:

用文件描述符号 绑定 一个文件
文件描述符号: File Describe        简称 fd        本质是个整数
操作系统内核会维护这个整数,把它和硬盘中的一个文件联系在一起,互为映射

标准fd
    0    标准输入        stdin
    1    标准输出        stdout
    2    标准错误输出    stderror
都是终端设备

lseek 挪文件内容指针
    SEEK_SET    文件头
    SEEK_END    文件尾
    SEEK_CUR    当前位置

头文件有点多,不过不用管,毕竟一口气全复制过去以后用啥直接就能用不用再考虑头文件

#include <stdio.h>

#include <unistd.h> //linux操作系统标准头文件

#include <string.h> //memcpy

#include <stdlib.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h> //umask

#include <time.h>

#include <sys/time.h>

#include <dirent.h> //遍历目录

#include <fcntl.h>  //文件映射虚拟内存

#include <sys/mman.h>

#include <wait.h>

#include <signal.h> //SIGCHLD

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/select.h>

void writeFile(int argc, char *argv[])

{

    if (argc < 2)

    {

        printf("请命令行输入文件名\n");

        exit(-1);

    }

    int fd = open(argv[1], O_WRONLY);

    if (-1 == fd)

    {

        // 错误信息会直接通过%m输出出来

        printf("打开%s失败:%m\n", argv[1]);

        fd = open(argv[1], O_WRONLY | O_CREAT, 0666);

        if (-1 == fd)

        {

            printf("创建%s失败:%m\n", argv[1]);

            exit(-1);

        }

        printf("创建文件成功\n");

    }

    printf("打开文件成功\n");

    char name[100];

    memset(name, 0, sizeof(name));

    char temp[20];

    memset(temp, 0, sizeof(temp));

    int age;

    double score;

    write(1, "请输入姓名:", strlen("请输入姓名:") + 1);

    read(0, name, 100);

    write(1, "请输入年龄:", strlen("请输入年龄:") + 1);

    read(0, temp, 20);

    age = atoi(temp);

    write(1, "请输入成绩:", strlen("请输入成绩:") + 1);

    bzero(temp, 0);

    read(0, temp, 20);

    score = atof(temp);

    char s[100];

    memset(s, 0, sizeof(s));

    sprintf(s, "%s同学今年%d岁了,考了%f分", name, age, score);

    // write(1,s,100);

    write(fd, s, 100);

    close(fd);

}

// 读文件

void readFile(int argc, char *argv[])

{

    if (argc < 2)

    {

        printf("请命令行输入文件名\n");

        exit(-1);

    }

    int fd = open(argv[1], O_RDONLY);

    if (-1 == fd)

    {

        printf("打开%s失败:%m\n", argv[1]);

        exit(-1);

    }

    printf("打开文件成功\n");

    char arr[100];

    read(fd, arr, 100);

    printf("%s\n", arr);

    close(fd);

}

// 读取文件状态

// void fileStat(int argc, char *argv[])

// {

//  if (argc < 2)

//  {

//      printf("请命令行输入文件名\n");

//      exit(-1);

//  }

//  struct stat st;

//  int ret = stat(argv[1], &st);

//  if (-1 == ret)

//  {

//      printf("获取文件状态失败:%m\n");

//      exit(-1);

//  }

//  printf("最终修改时间:%ld %ld\n", st.st_atim.tv_sec, st.st_atim.tv_nsec);

//  struct tm *t = localtime(&st.st_atim);

//  printf("%d-%d-%d %d:%d:%d 星期%d\n", t->tm_year, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, t->tm_wday);

//  printf("文件类型%d\n", st.st_mode);

//  if (st.st_mode & S_IFDIR)

//  {

//      printf("%s是个目录\n", argv[1]);

//  }

//  else

//  {

//      printf("%s是个文件\n", argv[1]);

//  }

//  printf("文件大小%ld\n", st.st_size);

// }

// 拷贝文件

void fileCp(int argc, char *argv[])

{

    if (argc < 3)

    {

        printf("请命令行输入文件名和拷贝后的文件名\n");

        exit(-1);

    }

    // 拷贝argv[1] 为 argv[2]

    int fdSrc = open(argv[1], O_RDONLY);

    if (-1 == fdSrc)

    {

        printf("打开待拷贝文件失败:%m");

        exit(-1);

    }

    int fdDst = open(argv[2], O_WRONLY | O_CREAT, 0666);

    if (-1 == fdDst)

    {

        printf("打开拷贝后的文件失败:%m");

        exit(-1);

    }

    // 循环读取并写入

    int r;

    char temp[1024];

    while (1)

    {

        r = read(fdSrc, temp, 1024);

        if (r <= 0)

            break;             // 没读到就退出

        write(fdDst, temp, r); // 读到多少写多少

    }

    close(fdDst);

    close(fdSrc);

    printf("拷贝完毕\n");

    system("ls");

}

// 移动文件

/*

void fileMv(int argc, char *argv[])

{

    if (argc < 3)

    {

        printf("请命令行输入文件名和拷贝后的文件名\n");

        exit(-1);

    }

    struct stat st;

    int ret = stat(argv[2], &st);

    if (-1 == ret)

    {

        printf("获取文件状态失败:%m\n");

        exit(-1);

    }

    int fdSrc = open(argv[1], O_RDONLY);

    if (-1 == fdSrc)

    {

        printf("打开待拷贝文件失败:%m");

        exit(-1);

    }

    int fdDst;

    if (st.st_mode & S_IFDIR)

    { // 是目录,移动,拷贝到指定目录后删除

        char dstName[256] = {0};

        sprintf(dstName, "%s/%s", argv[2], argv[1]);

        fdDst = open(dstName, O_WRONLY | O_CREAT, 0666);

        if (-1 == fdDst)

        {

            printf("目录if内\n");

            printf("打开拷贝后的文件失败:%m\n");

            exit(-1);

        }

    }

    else

    {

        // 不是目录,重命名,复制到当前目录后后删除

        printf("else内\n");

        fdDst = open(argv[2], O_WRONLY | O_CREAT, 0666);

        if (-1 == fdDst)

        {

            printf("打开拷贝后的文件失败:%m\n");

            exit(-1);

        }

    }

    // 循环读取并写入

    int r;

    char temp[1024];

    while (1)

    {

        r = read(fdSrc, temp, 1024);

        if (r <= 0)

            break;             // 没读到就退出

        write(fdDst, temp, r); // 读到多少写多少

    }

    unlink(argv[1]); // 删除当前源

    close(fdDst);

    close(fdSrc);

    printf("移动完毕\n");

    system("ls");

}

*/

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

{

    // readFile(argc,argv);

    // fileStat(argc,argv);

    // fileCp(argc,argv);

    // fileMv(argc, argv);

    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_55149044/article/details/140899257