C语言--day26

strtok

char *strtok(char *str, const char *delim)

  • 功能:字符串分割
  • 参数:
  • str:要分割字符串的首地址
  • delim:分隔符
  • 返回值:
  • 成功:返回分隔到的字符串的首地址
  • 失败:NULL
使用文件IO实现文件的拷贝
cs 复制代码
int copy_file(const char *srcname, const char *dstname)
{
    int fdsrc = open(srcname, O_RDONLY);
    int fddst = open(dstname, O_WRONLY | O_CREAT | O_TRUNC, 0664);
    if (fdsrc < 0 || fddst < 0)
    {
        printf("open error\n");
        return -1;
    }
    char buff[1024] = {0};
    while (1)
    {
        ssize_t size = read(fdsrc, buff, sizeof(buff));
        if (size <= 0) //==0 :文件末尾 <0 :出错
        {
            break;
        }
        write(fddst, buff, size);
    }
    close(fdsrc);
    close(fddst);
    return 0;
}
文件位置定位函数

off_t lseek(int fd, off_t offset, int whence)

  • 功能:文件读写位置偏移和定位
  • 参数:
  • fd:需要重定位的文件
  • offset:偏移量(字节)
  • whence:要偏移的起始位置
  • SEEK_SET :文件开头
  • SEEK_CUR :文件当前读写位置
  • SEEK_END :文件末尾
  • 返回值:
  • 成功:返回偏移后的位置到文件开头的偏移量
  • 失败:-1
  • 求文件大小:len
  • off_t len = lseek(fd, 0, SEEK_END);
  • lseek(fd, 0, SEEK_SET); //复位

文件IO和标准IO的区别

|----------------------------------|--------------------------------------|
| 文件IO | 标准IO |
| 面向文件描述符fd | 面向文件流指针FILE * |
| 由Linux内核提供,属于系统调用,跨平台可移植性弱 | C标准库函数,跨平台可移植性强 |
| 无缓冲区,所以可以用在对硬件的控制上 | 有缓冲区,实现数据缓存,避免频繁进行用户空间和内核空间切换带来的时间消耗 |
| 可以操作普通文件,也可以操作硬件相关的设备类文件,管道,套接字等 | 主要使用在对普通文件(-)的读写上,文本文件操作居多 |

缓冲区

  • 定义:高速设备和低速设备进行交互时,为了匹配低速设备的速率,需要在高速设备和低速设备之间增加一个缓冲区,用于数据缓存。(比如:队列)
  • 行缓冲:1k字节, terminal,主要用于人机交互--- stdout ---终端
  • 缓存区满或者遇到\n刷新,行缓存多是关于终端的一些操作
  • 遇到 \n刷新
  • 缓存区满刷新
  • 程序结束刷新
  • fflush刷新 fflush(stdout); //强制刷新
  • 全缓冲:4k,主要用于文件的读写 --- 普通文件的操作
  • 缓存区满刷新缓存区 4096
  • 对普通文件进行标准IO操作,建立的缓存一般为全缓存
  • 刷新条件:
  • 缓存区满刷新
  • 程序结束刷新
  • fflush来刷新 fflush(fp);
  • 文件关闭刷新
  • 无缓冲:0k 主要用于出错处理信息的输出 stderr
  • 不对数据缓存直接刷新
  • printf();==>>stdout
  • fprintf(strerr,"fopen error %s",filename);
  • 界面交互 出错处理

出错处理相关函数

errno
  • 定义:全局的错误码变量,程序运行过程中,会将对应的函数调用出错信息保存在这个变量中
strerror

char *strerror(int errnum)

  • 功能:将错误码装换成对应的错误信息,以字符串方式返回
  • 参数:
  • errnum:错误码
  • 返回值:
  • 返回错误码对应的错误描述信息
*perror
  • void perror(const char *s)
  • 功能:打印出错信息和出错原因
  • 参数:
  • s:自定义的错误信息
error

void error(int status, int errnum, const char *format, ...)

  • 功能:打印自定义的错误信息
  • error(1, errno, "%s : %s : %d :open error: aaa", FILE, func, LINE);
  • 参数:
  • status:状态值
  • 0 :SUCCESS
  • 1:FAIL
  • errnum:错误码:errno
  • format:格式化后错误信息字符串
c语言内置宏
  • FILE 表示是那个文件
  • LINE 表示第几行
  • FUNC 表示在那个函数 // FUNCTION
  • DATE 表示日期

目录操作

  1. 打开目录 opendir
  2. 读目录 readdir
  3. 关闭目录 closedir

DIR *opendir(const char *name)

  • 功能:打开一个目录并获得一个目录流指针
  • 参数:
  • name:目录名
  • 返回值:
  • 成功:目录流指针
  • 失败:NULL

struct dirent *readdir(DIR *dirp)

  • 功能:读取目录中的文件信息
  • 参数:
  • dirp:目录流指针
  • 返回值:
  • 成功:返回文件信息的结构体指针
  • 失败:NULL
cs 复制代码
struct dirent 
{
    ino_t     d_ino;          /* Inode number */
    off_t     d_off;          /* Not an offset; see below */
    unsigned  short d_reclen; /* Length of this record */
    unsigned  char d_type;    /* Type of file; not supported
                               by all filesystem types   */
    char      d_name[256];    /* Null-terminated filename */
};

int closedir(DIR *dirp)

  • 功能:关闭一个目录流
mkdir

int mkdir(const char *pathname, mode_t mode)

  • 功能:创建一个目录
  • 参数:
  • pathname:目录名
  • mode:对目录的读写执行权限 0777
  • 返回值:
  • 成功:0
  • 失败:-1

char *getcwd(char *buf, size_t size)

  • 功能:获取当前工作路径
  • 参数:
  • buf : 存储当前路径的空间
  • size:空间大小
  • 返回值:
  • 成功:buf的首地址
  • 失败:NULL

int chdir(const char *path)

  • 功能:修改当前工作路径
  • 参数:
  • path:新的工作路径
  • 返回值:
  • 成功:0
  • 失败:-1
其他
  • chmod 八进制值 文件名 -->>修改该文件的读写执行权限
  • chmod 0777 1.txt
  • pwd 获取当前目录对应的绝对路径

时间相关函数

time

time_t time(time_t *tloc)

  • 功能:获取1970-1-1 0:0:0到现在的秒数
  • 参数:
  • tloc:保存秒数的变量地址
  • 返回值:
  • 返回秒数
ctime

char *ctime(const time_t *timep)

  • 功能:将秒数转换成字符串时间
  • 参数:
  • timep:秒数的地址
  • 返回值:
  • 返回时间字符串
localtime

struct tm *localtime(const time_t *timep)

  • 功能:将秒数转换成日历时间
  • 参数:
  • timep:秒数的地址
  • 返回值:
  • 返回具体时间的结构体指针
cs 复制代码
struct tm 
{
    int tm_sec;     /* Seconds (0-60) */
    int tm_min;     /* Minutes (0-59) */
    int tm_hour;    /* Hours (0-23) */
    int tm_mday;    /* Day of the month (1-31) */
    int tm_mon;     /* Month (0-11) */
    int tm_year;    /* Year - 1900 */
    int tm_wday;    /* Day of the week (0-6, Sunday = 0) */
    int tm_yday;    /* Day in the year (0-365, 1 Jan = 0) */
    int tm_isdst;   /* Daylight saving time */
};
相关推荐
luj_17681 小时前
硝酸体系核关联假说解析
服务器·c语言·开发语言·经验分享·算法
love_muming1 小时前
数据结构入门:栈与队列详解
java·开发语言·数据结构
Je1lyfish1 小时前
CMU15-445 (2025 Fall/2026 Spring) Project#4 - Concurrency Control
开发语言·数据库·c++·笔记·后端·算法·系统架构
mjhcsp2 小时前
C++ 单位根反演(Roots of Unity Filter)全解析
开发语言·c++
1104.北光c°2 小时前
深度剖析 Spring 灵魂:IOC 容器与自动装配的原理、设计与实现
java·开发语言·笔记·后端·spring·rpc·ioc
Volunteer Technology2 小时前
Spring6.0新特性
java·开发语言·spring
pixelpilot12 小时前
微软常用运行库directx修复工具(directx repair)2026版directx下载下载安装教程
java·开发语言·其他·microsoft
cany10002 小时前
C++进阶 -- std::deque‌ 和 ‌std::list
开发语言·c++
曾几何时`2 小时前
Go(二)Goroutine及GMP模型
开发语言·后端·golang