如何编写C程序create_borts_file生成指定范围无符号双字节大端整数文件
如何修改C程序生成大端序短整数文件?
需要编写名为create_borts_file的C程序,该程序接收文件名、整数范围起始值、结束值三个参数,生成存储大端序短整数(bort即big-endian short)的二进制文件。现有一段生成文本整数的代码,需修改使其满足:执行命令./create_borts_file fortytwo.bort 40 42后,用print_bytes工具查看文件能得到指定的字节输出。
现有代码
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *output_stream = fopen(argv[1], "w"); if (output_stream == NULL) { perror(argv[1]); return 1; } for (int i = atoi(argv[2]); i <= atoi(argv[3]); i++) { fprintf(output_stream, "%d\n", i); } fclose(output_stream); return 0; }
预期print_bytes输出
./create_borts_file fortytwo.bort 40 42 ./print_bytes fortytwo.bort byte 0: 0 0x00 byte 1: 40 0x28 '(' byte 2: 0 0x00 byte 3: 41 0x29 ')' byte 4: 0 0x00 byte 5: 42 0x2a '*'
修改方案及代码
要实现需求,需要做以下关键修改:
- 以二进制模式打开文件,避免文本模式的换行符转换等问题,使用
"wb"替代"w" - 将整数转换为大端序的short类型:适配不同平台的字节序,保证输出为高字节在前的大端格式
- 使用
fwrite写入二进制数据,替代文本输出的fprintf - 增加参数数量检查,避免非法输入导致的崩溃
修改后的代码:
#include <stdio.h> #include <stdlib.h> #include <stdint.h> // 引入固定宽度类型,确保short是16位 // 将16位整数转换为大端序 uint16_t to_big_endian(uint16_t val) { #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ return ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00); #else return val; // 本身就是大端序,直接返回 #endif } int main(int argc, char *argv[]) { // 检查参数数量是否正确 if (argc != 4) { fprintf(stderr, "用法: %s <文件名> <起始值> <结束值>\n", argv[0]); return 1; } // 以二进制写入模式打开文件 FILE *output_stream = fopen(argv[1], "wb"); if (output_stream == NULL) { perror(argv[1]); return 1; } int start = atoi(argv[2]); int end = atoi(argv[3]); // 遍历范围,写入每个大端序short for (int i = start; i <= end; i++) { uint16_t val = (uint16_t)i; // 转换为16位无符号整数 uint16_t be_val = to_big_endian(val); // 写入2字节的大端序数据 fwrite(&be_val, sizeof(uint16_t), 1, output_stream); } fclose(output_stream); return 0; }
关键修改说明
- 二进制文件打开:使用
"wb"模式打开文件,确保写入的是原始二进制字节,不会被文本模式修改。 - 大端序转换:通过宏判断当前系统的字节序,如果是小端序则交换高低字节,保证输出的是大端序(高字节在前,低字节在后)。比如数值40(0x28)转换后是0x0028,对应字节为0x00、0x28,和预期输出一致。
- 二进制写入:使用
fwrite直接写入转换后的16位整数,每个整数占2字节,循环写入起始到结束的所有值,正好对应预期的6字节(3个short)。 - 参数检查:增加参数数量校验,提示正确用法,避免因参数不足导致的非法内存访问。
内容的提问来源于stack exchange,提问作者FreeAntiVirus
相关产品推荐
相关产品推荐

