如何在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
相关产品推荐
相关产品推荐

