我目前正在编写一个带有客户端 - 服务器架构(TCP通信)的iOS应用程序。我现在在服务器端编写一个模块,它应该将声音文件作为十六进制值读取,并将声音文件1024×1024字节发送给客户端。
我不是一位经验丰富的C ++开发人员,我需要一些文件阅读方面的帮助。现在我的代码是:
void PacketInterpreter::sendFile(int turn, int gameID){
std::string absoluteFilePath = (std::to_string(gameID) + "/sound.caf");
unsigned char x;
std::ifstream file(absoluteFilePath, std::ios::binary);
file >> std::noskipws;
std::string outstream;
while(file >> x){
outstream << std::hex << (int)x;
}
}
我正在接受
现在二进制表达式的无效操作数('std :: string'(又名) 'basic_string,allocator&gt;')和 'std :: __ 1 :: ios_base&amp;(std :: __ 1 :: ios_base&amp;)')
错误,我想出了编译器抱怨的那个,因为它不想逐字节地读入std :: string。但是,为什么我不知道。
如果你能帮我找到更好的方法,我会很高兴的。我喜欢有关如何将文件拆分为1024字节块的一些输入。提前谢谢!
答案 0 :(得分:2)
不要将格式化的流插入(&lt;&lt;&lt;)或提取(&gt;&gt;)运算符与二进制文件一起使用。
而是使用istream::read
或ostream::write
方法。
编辑1:块读取示例。
#define BUFFER_CAPACITY 512
unsigned char buffer[BUFFER_CAPACITY];
ifstream input_data("my_data.caf");
input_data.read((unsigned char)&buffer[0], sizeof(buffer));
//...
cout << "Look, first by is "
<< "0x" << hex << buffer[0]
<< " or as decimal: " << dec << buffer[0]
<< endl;
答案 1 :(得分:1)
由于OP还要求读取1K块并希望警告一个不会产生十六进制数字对的简单十六进制,这里有一个更全面的解决方案草案。错误处理是粗略的,但不应省略。
#include <fstream>
#include <iostream>
#include <iomanip>
void process( char* buffer, size_t len ){
for( int i = 0; i < len; i++ ){
std::cout << std::setbase( 16 ) << std::setw( 2 ) << std::setfill( '0' )
<< (unsigned)buffer[i];
}
}
void sendfile( char * pathname ){
std::ifstream ifs( pathname, std::ifstream::in );
if( ifs.fail() ) throw "error opening";
const std::size_t BUFFER_SIZE = 1024;
char buffer [BUFFER_SIZE];
size_t nRead = 0;
while( ifs.read (buffer, sizeof(buffer)) ){
process( buffer, ifs.gcount() );
}
if( ! ifs.eof() ) throw "error reading";
process( buffer, ifs.gcount() );
ifs.close();
}
int main( int argc, char* args[] ){
if( 0 == argc ) throw "missing argument";
sendfile( args[1] );
}