C++ 进阶 day8

5.7 回归

格式串转字符串存入字符数组中:sprintf/snprintf

是字符数组,不是文件

  • printf是向终端打印字符串
  • fprintf是向外部文件中打印字符串
  • sprintf/snprintf是向字符数组打印,不同类型的数据可以组成字符串放入字符数组
  • 区别:越界处理方式+返回值

sprintf

int sprintf(char *str, const char *format, ...);

  • 功能:将指定的格式串转换为字符串,放入字符数组中
  • 参数1:字符数组的起始地址
  • 参数2:格式串,可以包含多个格式控制符
  • 参数3:可变参数
  • 返回值:成功返回转换的字符个数,失败返回EOF

对于上述函数而言,用一个小的容器去存储一个大的转换后的字符时,会出现指针越界的段错误,为了安全起见,引入了snprintf

snprintf

int snprintf(char *str, size_t size, const char *format, ...);

  • 功能:将格式串中最多size-1个字符转换为字符串,存放到字符数组中
  • 参数1:字符数组的起始地址
  • 参数2:要转换的字符个数,最多为size-1
  • 参数3:格式串,可以包含多个格式控制符
  • 参数4:可变参数
  • 返回值:如果转换的字符小于size时,返回值就是成功转换字符的个数,如果大于size则只转换size-1个字符,返回值就是size,失败返回EOF

模块化读写 (fread/fwrite)

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

  • 参数1:容器指针
  • 参数2:sizeof(数据类型) 字符,整数,结构体
  • 参数3:项数
  • 参数4:文件指针

关于文件光标:fseek/ftell/rewind

fseek

int fseek(FILE *stream, long offset, int whence);

  • 移动指针
  • 文件指针
  • 偏移量
  • 偏移起始点
  • SEEK_SET:起始
  • SEEK_CUR:当前位置
  • SEEk_END:结束
  • 返回值:成功返回0,失败返回-1并置位错误码

ftell

long ftell(FILE *stream);
功能:获取偏移量

rewind

void rewind(FILE *stream);
功能:将光标定位在开头

文件IO

  • open、close、read、write、lseek
  • 标准io的基础,该操作效率较低,因为没有缓冲区的概念

文件描述符

  • 文件描述符的本质是一个大于等于0的整数,在使用open函数打开文件时,就会产生一个用于操作文件的句柄,这就是文件描述符
  • 通常限制1024,使用ulimit -a查看,ulimit -n修改
  • 最小分配原则
  • 0,1,2默认打开,标准输出,标准输入,标准错误

打开文件open

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
同一个函数,最后一个参数不填写会随机给出

  • 文件路径
  • 模式
  • 权限

关闭文件

#include <unistd.h>
int close(int fd);
功能:关闭文件描述符对应的文件

3.4 读写操作:read、write

read

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count)

  • 描述符
  • 地址
  • 读取字符的个数

write

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

  • 描述符
  • 地址
  • 写入字符的个数

关于光标的操作:lseek

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

  • 功能:返回光标所在的位置
  • 描述符
  • 偏移量
  • 起始位置
    与前面一样
posted @ 2025-05-07 23:03  北燃  阅读(26)  评论(0)    收藏  举报