vc++读取二进制 转换字符
vc++从二进制文件读取了一段数据,存在了byte[]数组中,使用memcpy将它们复制到wchar*中,然后赋给cstringw,可是在输出的时候,cstringw的后...
vc++从二进制文件读取了一段数据,存在了byte[]数组中,使用memcpy将它们复制到wchar*中,然后赋给cstringw,可是在输出的时候,cstringw的后面比我从文件中读出来的字符串多了一位,而且还是有点规律的字符。
请大家帮忙解惑,最好能给出一些读取二进制文件,然后转换成字符串显示的实例,谢谢大家。
我是读取的xls文件,在读取sheetname的时候,sheetname的名字后面会多一个字符,每次读取有变化。
xls文件中对sheetname的存储有区分,含中文的用双字节,不含的用单字节,我也是按照他的标准读取的长度。
我再网上找了集中方法可以把读出来的内容赋值到变量了,但是不知道用memcpy是不是正确的方法,单步调试的时候,当执行完memcpy后wchar*的内容结尾处就已经多了字符了。
麻烦大家再帮忙讲解一下,谢谢。 展开
请大家帮忙解惑,最好能给出一些读取二进制文件,然后转换成字符串显示的实例,谢谢大家。
我是读取的xls文件,在读取sheetname的时候,sheetname的名字后面会多一个字符,每次读取有变化。
xls文件中对sheetname的存储有区分,含中文的用双字节,不含的用单字节,我也是按照他的标准读取的长度。
我再网上找了集中方法可以把读出来的内容赋值到变量了,但是不知道用memcpy是不是正确的方法,单步调试的时候,当执行完memcpy后wchar*的内容结尾处就已经多了字符了。
麻烦大家再帮忙讲解一下,谢谢。 展开
3个回答
展开全部
使用C++读写二进制文件
要读取文件必须包含fstream头文件,这里包含了C++读写文件的方法。可以使用fstream类,这个类可以对文件进行读写操作。1、打开文件。打要读取文件必须包含fstream头文件,这里包含了C++读写文件的方法。
可以使用fstream类,这个类可以对文件进行读写操作。
1、打开文件。
打开文件可以有两种方式,第一种可以使用fstream类的构造函数。
fstream file;
另外一种方法就是使用open函数。
fstream file;
file.open;
这样就可以打开一个可读写的文件了。假如文件不存在的话,就会创建一个新文件并且以读写方式打开。
这里需要说明一点,假如文件不存在的话,open函数中第二个参数必须包含ios_base::outios_base::app,
否则就不能正确创建文件。
2、写文件。
先进性写文件的操作否则读一个空文件是没有意义的。
既然是写二进制文件可以向文件中写入一个整形值。写二进制字符只能使用write函数。
但是write函数的原形是write。第一个参数是char 类型,所以需要把将要写入
文件的int类型转换成char 类型。这里的转换困扰了我好几天,不过终于弄明白了。代码如下。
int tem
file.write,sizeof);
3、读文件。
可以写文件了,读文件就好办多了。读文件需要用到read函数。其参数和write大致相同,read。
要把内容读到int类型变量中同样涉及到一个类型转换的问题。和写文件一样。
int readInt;
file.read,sizeof);
这样文件中的int值就读入到int型变量readInt中了。
4、文件指针。
在文件的读写过程中往往需要对文件进行选择性读取。所以需要进行文件指针的移动。这是需要用到seekg和seekp函数。
在fstream类中有两个文件指针,一个是读取文件的指针,一个是写文件的指针分别用tellg和tellp文件来取得指针的位置。
同样seekg和seekp两个函数分别是对这两个指针进行移动的函数。这两个函数的参数都是一样的。
先对几个枚举类型进行一下说明:
ios_base::beg ——文件开始位置
ios_base::cur ——文件当前位置
ios_base::end ——文件末尾位置
下面以seekg为例说明一下指针移动的方法:
file.seekg ——指针移动到第三个字符的位置
file.seekg ——指针移动到文件开头
file.seekg ——指针移动到文件末尾
file.seekg ——指针当前位置向前移动三个字符
file.seekg ——指针当前位置向后移动三个字符
file.seekg) ——指针当前位置向后移动三个字符
file.seekg+3) ——指针当前位置向后移动三个字符
5、对文件操作完毕后别忘了关闭文件。
file.close;
以上5个步骤就完成了对文件的读写操作。文本文件的操作是相同的,比二进制文件还要简单。
要读取文件必须包含fstream头文件,这里包含了C++读写文件的方法。可以使用fstream类,这个类可以对文件进行读写操作。1、打开文件。打要读取文件必须包含fstream头文件,这里包含了C++读写文件的方法。
可以使用fstream类,这个类可以对文件进行读写操作。
1、打开文件。
打开文件可以有两种方式,第一种可以使用fstream类的构造函数。
fstream file;
另外一种方法就是使用open函数。
fstream file;
file.open;
这样就可以打开一个可读写的文件了。假如文件不存在的话,就会创建一个新文件并且以读写方式打开。
这里需要说明一点,假如文件不存在的话,open函数中第二个参数必须包含ios_base::outios_base::app,
否则就不能正确创建文件。
2、写文件。
先进性写文件的操作否则读一个空文件是没有意义的。
既然是写二进制文件可以向文件中写入一个整形值。写二进制字符只能使用write函数。
但是write函数的原形是write。第一个参数是char 类型,所以需要把将要写入
文件的int类型转换成char 类型。这里的转换困扰了我好几天,不过终于弄明白了。代码如下。
int tem
file.write,sizeof);
3、读文件。
可以写文件了,读文件就好办多了。读文件需要用到read函数。其参数和write大致相同,read。
要把内容读到int类型变量中同样涉及到一个类型转换的问题。和写文件一样。
int readInt;
file.read,sizeof);
这样文件中的int值就读入到int型变量readInt中了。
4、文件指针。
在文件的读写过程中往往需要对文件进行选择性读取。所以需要进行文件指针的移动。这是需要用到seekg和seekp函数。
在fstream类中有两个文件指针,一个是读取文件的指针,一个是写文件的指针分别用tellg和tellp文件来取得指针的位置。
同样seekg和seekp两个函数分别是对这两个指针进行移动的函数。这两个函数的参数都是一样的。
先对几个枚举类型进行一下说明:
ios_base::beg ——文件开始位置
ios_base::cur ——文件当前位置
ios_base::end ——文件末尾位置
下面以seekg为例说明一下指针移动的方法:
file.seekg ——指针移动到第三个字符的位置
file.seekg ——指针移动到文件开头
file.seekg ——指针移动到文件末尾
file.seekg ——指针当前位置向前移动三个字符
file.seekg ——指针当前位置向后移动三个字符
file.seekg) ——指针当前位置向后移动三个字符
file.seekg+3) ——指针当前位置向后移动三个字符
5、对文件操作完毕后别忘了关闭文件。
file.close;
以上5个步骤就完成了对文件的读写操作。文本文件的操作是相同的,比二进制文件还要简单。
展开全部
你存的时候是不是wchar?存什么取什么。如果是CHAR就要转换,不是就不用转了。。
多的一位可能是\0结尾的。你知道要读的长度,在建内存时,多建一个。再zeromemory
把他置0.输出就不会有乱的了。
多的一位可能是\0结尾的。你知道要读的长度,在建内存时,多建一个。再zeromemory
把他置0.输出就不会有乱的了。
追问
感谢您的回答,我补充了一下问题,麻烦您在帮忙看一下,谢谢。
追答
我没有读过XLS文件。。如果多了字符,就是拷贝时的长度问题,你相应的减少就行了。。
拷贝之前最好把内存置0.。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问个问题?
为什么要用wchar 工程是UNICODE的? 字符是UTF-8?
UTF-8的null字符编码成2个字节(1100000010000000) 而不是标准的(00000000)
为什么要用wchar 工程是UNICODE的? 字符是UTF-8?
UTF-8的null字符编码成2个字节(1100000010000000) 而不是标准的(00000000)
更多追问追答
追问
vs2008 工程是unicode的 文件中读取的字符包括中文,感谢您的回答,希望您能再帮忙讲解一下。
追答
读出来WideCharToMultiByte然后直接输出嘛
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询