当前位置: 首页 > news >正文

io函数 day3 文件io与系统函数

文件IO

  1. 概念:程序和文件系统之间的数据交互
    • 特点:无缓冲区、不可移植、可访问多种文件类型、属系统调用、使用文件描述符
  2. 文件描述符
    • 本质:数组下标,默认1024个,范围[0 - 1023]
    • 申请规则:从小到大分配未申请的
    • 特殊描述符:stdin(0)、stdout(1)、stderr(2)
  3. 文件IO函数
    • open:打开文件
      • 参数:路径文件名、访问模式(必选一种,可添加其他选项)、权限(与O_CREAT有关)
      • 返回值:成功新描述符,失败-1
    • umask:文件权掩码
      • 查看:umask命令
      • 修改:shell指令或函数
    • close:关闭文件,参数为文件描述符
    • write:写入数据,返回写入字节数
    • read:读取文件,返回读取字符数
    • lseek:文件指针偏移
      • 参数:文件描述符、偏移量、起始位置
      • 返回值:起始到当前位置偏移量

获取文件信息

  1. stat:获取文件信息(不包括软链接)
    • 参数:路径文件名、存储信息结构体
    • 返回值:成功0,失败-1
  2. getpwuid:根据用户id获取用户信息
  3. getgrgid:根据组id获取组信息
  4. 获取文件类型和权限
    • 文件类型:由st_mode高4位决定
    • 权限:由st_mode第9位决定

目录相关函数

  1. opendir:打开目录,返回目录流指针
  2. closedir:关闭目录流指针
  3. readdir:读取目录信息,返回结构体

作业:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include "headhs.h"
int main(int argc, const char *argv[])
{
    // 打开 BMP 文件
    int fd = open("xiaoxin.bmp", O_RDONLY);
    if (fd < 0)
        pt_er("打开文件失败");

    // ------------------------- 文件头 (14字节) -------------------------
    // 1. 读取文件类型 (偏移 0x00, 2字节)
    unsigned short bfType;
    lseek(fd, 0x00, SEEK_SET);
    if (read(fd, &bfType, sizeof(bfType)) <= 0)
        pt_er("读取文件类型失败");
    if (bfType != 0x4D42)  // "BM" 的十六进制小端表示是 0x424D,但需根据系统字节序调整
        pt_er("非标准BMP文件(需为BM类型)");
    printf("文件类型: 0x%04X (BM)\n", bfType);

    // 2. 读取文件大小 (偏移 0x02, 4字节)
    unsigned int bfSize;
    lseek(fd, 0x02, SEEK_SET);
    if (read(fd, &bfSize, sizeof(bfSize)) <= 0)
        pt_er("读取文件大小失败");
    printf("文件大小: %u 字节\n", bfSize);

    // 3. 读取像素数据偏移量 (偏移 0x0A, 4字节)
    unsigned int bfOffBits;
    lseek(fd, 0x0A, SEEK_SET);
    if (read(fd, &bfOffBits, sizeof(bfOffBits)) <= 0)
        pt_er("读取像素数据偏移量失败");
    printf("像素数据偏移量: %u 字节\n", bfOffBits);

    // ---------------------- 位图信息头 (40字节) ----------------------
    // 4. 读取信息头大小 (偏移 0x0E, 4字节)
    unsigned int biSize;
    lseek(fd, 0x0E, SEEK_SET);
    if (read(fd, &biSize, sizeof(biSize)) <= 0)
        pt_er("读取信息头大小失败");
    printf("信息头大小: %u 字节\n", biSize);

    // 5. 读取图像宽度 (偏移 0x12, 4字节)
    int biWidth;
    lseek(fd, 0x12, SEEK_SET);
    if (read(fd, &biWidth, sizeof(biWidth)) <= 0)
        pt_er("读取图像宽度失败");
    printf("宽度: %d 像素\n", biWidth);

    // 6. 读取图像高度 (偏移 0x16, 4字节)
    int biHeight;
    lseek(fd, 0x16, SEEK_SET);
    if (read(fd, &biHeight, sizeof(biHeight)) <= 0)
        pt_er("读取图像高度失败");
    printf("高度: %d 像素\n",biHeight);

    // 7. 读取位平面数 (偏移 0x1A, 2字节)                                                    
    unsigned short biPlanes;
    lseek(fd, 0x1A, SEEK_SET);
    if (read(fd, &biPlanes, sizeof(biPlanes)) <= 0)
        pt_er("读取位平面数失败");
    printf("位平面数: %hu\n", biPlanes);

    // 8. 读取每像素位数 (偏移 0x1C, 2字节)
    unsigned short biBitCount;
    lseek(fd, 0x1C, SEEK_SET);
    if (read(fd, &biBitCount, sizeof(biBitCount)) <= 0)
        pt_er("读取每像素位数失败");
    printf("每像素位数: %hu\n", biBitCount);

    // 9. 读取压缩方式 (偏移 0x1E, 4字节)
    unsigned int biCompression;
    lseek(fd, 0x1E, SEEK_SET);
    if (read(fd, &biCompression, sizeof(biCompression)) <= 0)
        pt_er("读取压缩方式失败");
    printf("压缩方式: %u (0=无压缩)\n", biCompression);

    // 10. 读取图像数据大小 (偏移 0x22, 4字节)
    unsigned int biSizeImage;
    lseek(fd, 0x22, SEEK_SET);
    if (read(fd, &biSizeImage, sizeof(biSizeImage)) <= 0)
        pt_er("读取图像数据大小失败");
    printf("图像数据大小: %u 字节\n", biSizeImage);

    // 11. 读取水平分辨率 (偏移 0x26, 4字节)
    int biXPelsPerMeter;
    lseek(fd, 0x26, SEEK_SET);
    if (read(fd, &biXPelsPerMeter, sizeof(biXPelsPerMeter)) <= 0)
        pt_er("读取水平分辨率失败");
    printf("水平分辨率: %d 像素/米\n", biXPelsPerMeter);

    // 12. 读取垂直分辨率 (偏移 0x2A, 4字节)
    int biYPelsPerMeter;
    lseek(fd, 0x2A, SEEK_SET);
    if (read(fd, &biYPelsPerMeter, sizeof(biYPelsPerMeter)) <= 0)
        pt_er("读取垂直分辨率失败");
    printf("垂直分辨率: %d 像素/米\n", biYPelsPerMeter);

    // 13. 读取使用的颜色数 (偏移 0x2E, 4字节)
    unsigned int biClrUsed;
    lseek(fd, 0x2E, SEEK_SET);
    if (read(fd, &biClrUsed, sizeof(biClrUsed)) <= 0)
        pt_er("读取使用的颜色数失败");
    printf("使用的颜色数: %u\n", biClrUsed);

    // 14. 读取重要颜色数 (偏移 0x32, 4字节)
    unsigned int biClrImportant;
    lseek(fd, 0x32, SEEK_SET);
    if (read(fd, &biClrImportant, sizeof(biClrImportant)) <= 0)
        pt_er("读取重要颜色数失败");
    printf("重要颜色数: %u\n", biClrImportant);

    // 关闭文件:
    close(fd);
    return 0;
}

相关文章:

  • unity文字转语音usherpa-onnx-tts
  • 人工智能神经网络基本原理
  • 信创:信息技术应用创新产业
  • 软考高项(信息系统项目管理师)学习计划(2025)
  • 如何使用 Python+Flask+win32print 实现简易网络打印服务1
  • Python实战项目(‌Hands-on Python Project)
  • FFmpeg硬件编解码-C++
  • cursor使用经验分享(java后端服务开发向)
  • 3D建模--犀牛Rhino for Mac
  • 《Java基础 聊天窗口案例:剖析 GUI、文件 I/O 等关键技术知识》
  • SpringMVC控制器定义:@Controller注解详解
  • FFmpeg入门:最简单的音视频播放器
  • ubuntu挂载固态硬盘
  • 《Canvas修仙传·第四重天元婴境(下集)》 ——虚空幻境与三千法则的终极融合
  • Tampermonkey篡改猴官网,油猴脚本插件电脑版入口(含教程)
  • Fiji图像处理
  • 润开鸿重磅首发基于“RISC-V+OpenHarmony+星闪”的“鸿锐”AI开发平台
  • deepseek使用记录18——文化基因的物质标枪
  • 无人机应用探索:玻纤增强复合材料的疲劳性能研究
  • 自然语言处理:文本分类
  • 南宁电子推广网站/深圳百度推广seo公司
  • 网站建设是否包含等保/google关键词分析工具
  • 网站建设api/济南竞价托管公司
  • 有专业做网站/郑州网络推广公司排名
  • 招聘网站做鸭子的/百度快照怎么弄
  • 安居客做网站/德阳seo