C++生成多路7段显示LUT二进制文件报错求助
问题分析与解决
错误原因
你遇到的编译错误核心是错误地将std::ofstream文件流对象当作函数调用(比如fout1(value + 0, digits[...]);写法),std::ofstream根本没有接受两个参数的调用重载,所以编译器报错。
另外代码里还有几个问题:
- 打开文件时使用
fout1.binary|fout1.out是错误写法,应该用标准的std::ios::binary和std::ios::out标志 - 最后一行
fout1.write((char*)&fout1, 1);完全不合理,这是把文件流对象自身的内存内容写入文件,和生成LUT的需求完全不符 - 全局变量
value没必要,改成循环内的局部变量更规范
修正后的代码
#include <iostream> #include <fstream> #include <cstdint> // 显式包含标准固定宽度整数类型的头文件 using namespace std; int main() { cout << "Writing Binary File..." << endl; // 十六进制数字对应的7段显示码(0-F) int8_t digits[] = {0X3f, 0X06, 0X5b, 0X4f, 0X66, 0X6d, 0X7d, 0X07, 0X7f, 0X6f, 0X77, 0X7c, 0X39, 0X5e, 0X79, 0X71 }; // 正确打开二进制输出文件 ofstream fout1("HexDisplay.bin", ios::binary | ios::out); if (!fout1) { cerr << "Error opening output file.\n"; return 1; } // 写入个位的LUT(偏移0~65535) for (uint32_t value = 0; value <= 65535; ++value){ fout1.seekp(value); // 定位到目标偏移位置 // 写入对应的7段码(1个字节) fout1.write(reinterpret_cast<const char*>(&digits[(value / 1) % 16]), sizeof(int8_t)); } cout << "Ones Done!...\n"; // 写入十位的LUT(偏移65536~131071) for (uint32_t value = 0; value <= 65535; ++value){ fout1.seekp(value + 65536); fout1.write(reinterpret_cast<const char*>(&digits[(value / 16) % 16]), sizeof(int8_t)); } cout << "Tens Done!...\n"; // 写入百位的LUT(偏移131072~196607) for (uint32_t value = 0; value <= 65535; ++value){ fout1.seekp(value + 131072); fout1.write(reinterpret_cast<const char*>(&digits[(value / 256) % 16]), sizeof(int8_t)); } cout << "Hundreds Done!...\n"; // 写入千位的LUT(偏移196608~262143) for (uint32_t value = 0; value <= 65535; ++value){ fout1.seekp(value + 196608); fout1.write(reinterpret_cast<const char*>(&digits[(value / 4096) % 16]), sizeof(int8_t)); } cout << "Thousands Done!...\n"; fout1.close(); // 显式关闭文件,更规范 cout << "Programming Complete!...\n"; return 0; }
关键修改说明
- 文件操作修正:
- 用
seekp()设置文件写入指针的位置,实现按指定偏移量写入 - 用
write()方法写入单个字节,reinterpret_cast<const char*>是把int8_t类型的指针转成char*,符合write()的参数要求
- 用
- 文件打开方式修正:使用
ios::binary | ios::out替代错误的fout1.binary|fout1.out - 变量优化:把全局的
value改成循环内的局部变量,避免全局变量污染 - 移除无效代码:删掉了最后一行无意义的
fout1.write((char*)&fout1, 1); - 规范头文件:添加
<cstdint>头文件,这是C++标准中定义uint32_t、int8_t等固定宽度整数类型的头文件,显式包含更规范
性能优化补充
如果不需要频繁移动文件指针,也可以按顺序连续写入四个LUT段,效率更高,生成的文件内容和之前完全一致:
// 先写入个位段 for (uint32_t value = 0; value <= 65535; ++value){ fout1.write(reinterpret_cast<const char*>(&digits[(value / 1) % 16]), sizeof(int8_t)); } // 再写入十位段 for (uint32_t value = 0; value <= 65535; ++value){ fout1.write(reinterpret_cast<const char*>(&digits[(value / 16) % 16]), sizeof(int8_t)); } // 以此类推写入百位、千位段...
内容的提问来源于stack exchange,提问作者Cramano
相关产品推荐
相关产品推荐

