C++读取midi文件出现问题

C++语言 码拜 7年前 (2017-04-17) 1428次浏览
本人用C++读取midi文件时发现部分字节会自动跳过。每当读到09 0a 0b 0c 0d时就读不出来,其他都可以正常读取。读取文件的代码如下

string getMidiData(char midi[])//读取midi文件
{
	ifstream in(midi,ios::binary);//将midi文件打开
	if(!in)
	{
		cerr<<"Midi file cannot be open"<<endl;
		exit(1);
	}//假如打开失败,则结束程序
	unsigned char z;//用于将文件内容读入的中转变量
	stringstream Temp;//用于读取midi文件内容的字符串流
	string Contain;//文件内容
	while (in >> z)
	{
		Temp<<hex<<setw(2)<<setfill("0")<<(int)z;
	}//将文件转为stringstream
	Contain = Temp.str();//将字符串流转化为字符串
	in.close();//关闭输入
	return Contain;
}

(上传图片老是失败,本人用文字描述一下结果)
原来的文件里面是00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
读取出来的字符串是00 01 02 03 04 05 06 07 08 0e 0f 10 11
有没有高手解释一下这是为什么啊?谢谢了!

解决方案

20

09 0a 0b 0c 0d,是不可见字符,不能使用“in >> z”读取出来,C++的输入输出流很不好使,特别是>><<非常诡异,建议不要使用,直接使用C语言的方式读写文件。
可以使用 in.get,代替“in >> z”

10

本人查了函数std::istream::operator>>并没有右操作数为unsigned char的重载,改用.get()试试

10

可以用二进制读取,.read

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++读取midi文件出现问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)