BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #93849同步于 2016/11/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]把C代码改成C++代码过程中遇到问题...

flgkd
2016/11/4镜像同步8 回复
今天看到如下的一个C代码: #include <stdio.h> int main(void) { FILE* fphzk = NULL; int i, j, k, offset; int flag; unsigned char buffer[32]; unsigned char word[3] = "我"; unsigned char key[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; fphzk = fopen("HZK16", "rb"); if(fphzk == NULL){ fprintf(stderr, "error HZK16\n"); return 1; } offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32; fseek(fphzk, offset, SEEK_SET); fread(buffer, 1, 32, fphzk); for(k=0; k<32; k++){ printf("%02X ", buffer[k]); //第22行 } printf("\n"); fclose(fphzk); fphzk = NULL; return 0; } 运行结果如下: 由于本人喜欢C++,就想把它改写成C++代码,第一次改成如下形式(由于原C代码的第22行不知道怎么改就先保留了): #include<iostream> #include<fstream> #include<iomanip> #include <stdio.h> using namespace std; int main() { int i, j, k, offset; int dc; unsigned char buffer[32]; unsigned char word[3] = "我"; unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32; ifstream ifile("HZK16",ios::in); if(ifile.fail()) { cout<<"HZK16 open fail!"<<endl; return 1; } ifile.seekg(offset,ios::beg); ifile.read(buffer,32); //21行 for(k=0; k<32; k++){ printf("%02X ", buffer[k]); } cout<<endl; ifile.close(); return 0; } 结果程序运行不出,错误描述为第21行有问题: 好像意思就是 如果buffer设成unsigned的话21行就不能执行。 所以我就把第10行buffer前面的unsigned去掉,即把代码改成: #include<iostream> #include<fstream> #include<iomanip> #include <stdio.h> using namespace std; int main() { int i, j, k, offset; int dc; char buffer[32]; unsigned char word[3] = "我"; unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32; ifstream ifile("HZK16",ios::in); if(ifile.fail()) { cout<<"HZK16 open fail!"<<endl; return 1; } ifile.seekg(offset,ios::beg); ifile.read(buffer,32); for(k=0; k<32; k++){ printf("%02X ", buffer[k]); } cout<<endl; ifile.close(); return 0; } 运行后结果是: 与c代码的输出不太一样... 所以我想请教大神们: 1.我的方法哪里错了?需要怎么改? 2.原c代码的22行应该怎么改成C++的流形式(即不用printf,用cout) 以下是HZK16文件: 附件(261.3KB) HZK16
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
nuanyangyang机器人#1 · 2016/11/4
楼主学学Python吧
youngsc机器人#2 · 2016/11/4
你只需要把printf输出的char字节转换为unsigned char就可以了。 printf第一个参数X规定了输出类型是无符号16进制整型数,char默认是有符号的,转到int会出现高位补齐的情况。
moses机器人#3 · 2016/11/5
HZK16.....这不是字库文件吗? [ema27]
flgkd机器人#4 · 2016/11/25
【 在 moses 的大作中提到: 】 : HZK16.....这不是字库文件吗? : 是的。。
flgkd机器人#5 · 2016/11/25
【 在 youngsc 的大作中提到: 】 : 你只需要把printf输出的char字节转换为unsigned char就可以了。 : printf第一个参数X规定了输出类型是无符号16进制整型数,char默认是有符号的,转到int会出现高位补齐的情况。 谢谢大神~按你说的的修改后可以了
wdjwxh机器人#6 · 2016/11/26
不遗余力的推广 ~ 我也想学python 【 在 nuanyangyang 的大作中提到: 】 : 楼主学学Python吧
nuanyangyang机器人#7 · 2016/11/26
Python大法好 尤其是涉及到汉字字符编码的问题,C语言一塌糊涂。 【 在 wdjwxh 的大作中提到: 】 : 不遗余力的推广 : ~ 我也想学python
wdjwxh机器人#8 · 2016/11/26
python2也感觉一蹋糊涂。。 现在RHEL和centos系上还是python2.6作为底 有时写个啥也不好用 【 在 nuanyangyang 的大作中提到: 】 : Python大法好 : 尤其是涉及到汉字字符编码的问题,C语言一塌糊涂。 :