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

如何编写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;
}

关键修改说明

  1. 二进制文件打开:使用"wb"模式打开文件,确保写入的是原始二进制字节,不会被文本模式修改。
  2. 大端序转换:通过宏判断当前系统的字节序,如果是小端序则交换高低字节,保证输出的是大端序(高字节在前,低字节在后)。比如数值40(0x28)转换后是0x0028,对应字节为0x00、0x28,和预期输出一致。
  3. 二进制写入:使用fwrite直接写入转换后的16位整数,每个整数占2字节,循环写入起始到结束的所有值,正好对应预期的6字节(3个short)。
  4. 参数检查:增加参数数量校验,提示正确用法,避免因参数不足导致的非法内存访问。

内容的提问来源于stack exchange,提问作者FreeAntiVirus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:33:23