You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中自动获取文件的宽度和高度?附控制台读取代码

嘿,我看到你的代码现在能读取并输出任意文件的内容了,但要获取文件的“宽度和高度”得先明确你指的是哪种类型的文件——是文本文件的行数(高度)和每行最大字符数(宽度),还是像图片这类二进制文件的像素尺寸?我分两种常见情况给你讲讲怎么做:

情况1:文本文件的行数与每行最大宽度

如果是普通文本文件,我们可以通过逐行读取的方式统计总行数(相当于“高度”),同时记录每行的字符数,找出最大值作为“宽度”。这里给你修改后的代码,还保留了原有的文件内容输出功能:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    // 先检查是否传入了文件名参数
    if (argc != 2) {
        printf("用法: %s <文件名>\n", argv[0]);
        return 1;
    }

    FILE *fs = fopen(argv[1], "r");
    if (!fs) {
        perror("打开文件失败");
        return 1;
    }

    char buffer[1024];
    int line_count = 0;
    int max_line_width = 0;

    // 逐行读取文件,统计行数和最大行宽
    while (fgets(buffer, sizeof(buffer), fs) != NULL) {
        line_count++;
        // 去掉换行符(避免影响宽度统计)
        size_t len = strlen(buffer);
        if (len > 0 && buffer[len-1] == '\n') {
            buffer[len-1] = '\0';
            len--;
        }
        // 更新最大宽度
        if (len > max_line_width) {
            max_line_width = len;
        }
    }

    fclose(fs);

    // 输出统计结果
    printf("文本文件统计:\n");
    printf("行数(高度): %d\n", line_count);
    printf("最大行宽(宽度): %d\n", max_line_width);

    // 重新打开文件输出内容(如果需要的话)
    fs = fopen(argv[1], "r");
    if (fs) {
        char dat;
        while((dat = fgetc(fs)) != EOF) {
            printf("%c", dat);
        }
        fclose(fs);
    }

    printf("\n");
    return 0;
}

这段代码做了这些优化:

  • 增加了参数检查和文件打开失败的错误提示,更健壮
  • 用fgets逐行读取,统计行数和每行的字符长度
  • 最后重新打开文件输出原内容,保留你原来的功能
情况2:二进制图像文件的像素宽高(以BMP为例)

如果是图像文件,“宽度和高度”指的是像素尺寸,这就得解析文件的头部信息了——不同图像格式的头结构不一样,这里拿最常见的BMP格式举例:

#include <stdio.h>
#include <stdint.h>

// 定义BMP文件头结构(固定14字节)
typedef struct {
    uint16_t type;          // 必须是0x4D42,也就是字符"BM"
    uint32_t size;          // 整个文件的大小
    uint16_t reserved1;     // 保留字段,固定为0
    uint16_t reserved2;     // 保留字段,固定为0
    uint32_t offset;        // 像素数据在文件中的起始位置
} BmpHeader;

// 定义BMP信息头结构(固定40字节)
typedef struct {
    uint32_t size;          // 信息头的大小,必须是40
    int32_t width;          // 图像宽度(像素数)
    int32_t height;         // 图像高度(像素数)
    uint16_t planes;        // 颜色平面数,必须是1
    uint16_t bits_per_pixel;// 每个像素的位数(比如24位真彩色)
    uint32_t compression;   // 压缩方式,0表示无压缩
    uint32_t image_size;    // 像素数据的大小
    int32_t x_ppm;          // 水平分辨率(像素/米)
    int32_t y_ppm;          // 垂直分辨率(像素/米)
    uint32_t colors_used;   // 使用的颜色数,0表示全部
    uint32_t colors_important;// 重要颜色数,0表示全部重要
} BmpInfoHeader;

int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("用法: %s <BMP文件名>\n", argv[0]);
        return 1;
    }

    // 注意要用二进制模式"rb"打开图像文件
    FILE *fs = fopen(argv[1], "rb");
    if (!fs) {
        perror("打开文件失败");
        return 1;
    }

    BmpHeader header;
    BmpInfoHeader info_header;

    // 读取文件头并验证是否是BMP文件
    fread(&header, sizeof(BmpHeader), 1, fs);
    if (header.type != 0x4D42) {
        printf("这不是一个有效的BMP文件哦\n");
        fclose(fs);
        return 1;
    }

    // 读取信息头,里面就包含了宽高信息
    fread(&info_header, sizeof(BmpInfoHeader), 1, fs);

    printf("BMP图像信息:\n");
    printf("宽度: %d 像素\n", info_header.width);
    printf("高度: %d 像素\n", info_header.height);

    // 如果要输出文件内容,二进制文件直接输出到控制台会有乱码,可选跳过或保留
    fseek(fs, 0, SEEK_SET);
    char dat;
    while((dat = fgetc(fs)) != EOF) {
        printf("%c", dat);
    }

    fclose(fs);
    printf("\n");
    return 0;
}

如果是PNG、JPG这类其他格式,你需要去查对应的文件格式规范,解析它们的头部数据来获取宽高。

内容的提问来源于stack exchange,提问作者Moch. Chamdani M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:54:53