Char Array在结束之前包含空字符

时间:2012-10-26 10:04:20

标签: c++ character-arrays null-character

我有一个用c ++制作网络服务器的课程项目。一切都很顺利,直到我需要托管图像或pdf,此时文件已损坏。做了一些挖掘,我意识到所有损坏的图像在结束之前都有空字符。

这让我想到了我的问题。我有一个char *,我已经读过这些文件了,我知道文件的长度。我非常肯定整个文件正在被读入(下面的代码),但我不知道如何打印出来或发送它。如何告诉C ++我想在char *之后发送前X个字符? (我确定答案就在这里或网上,我似乎无法以正确的方式表达我的问题以找到答案)

ifstream myfile (path.c_str() , ios::in|ios::binary|ios::ate);
ifstream::pos_type size = myfile.tellg();
cout << size << endl;
fileSize = (int) size;
fileToReturn = new char [size];
myfile.seekg (0, ios::beg);
myfile.read (fileToReturn, size);
myfile.close();

cout << "file read\n"<< fileToReturn << endl;

对于纯文本文件,这将输出正常。对于PDF,它仅打印文件的第一部分(第一个空字符之前的部分)。如何打印出整个文件?

编辑:为了澄清,我的最终目标是通过网络发送,而不是重新保存文件。

// reply is string with all my headers and everything set.
// fileToReturn is my char*, and fileSize is the int with how long it should be  
char* totalReply = new char [reply.length() + fileSize+1];
strcpy(totalReply, reply.c_str());
strcat(totalReply, fileToReturn);
send(client, totalReply, reply.length() + fileSize, 0);

2 个答案:

答案 0 :(得分:1)

问题是ostream& operator<< (ostream& out, const char* s );期望s是以空字符结尾的ASCII字符串。所以它一遇到NUL字符就会停止。如果您真的想将所有数据写入控制台,请使用“ostream& write ( const char* s , streamsize n ),如下所示:

cout.write(fileToReturn, size);

strcat的问题是相同的:它在第一个NUL字符后停止。所以使用memcpy连接:

memcpy(totalReply, reply.c_str(), reply.size()+1);
memcpy(totalReply+reply.size()+1, fileToReturn, fileSize )

但是你把这个问题标记为C ++,那么为什么不这样做呢:

ifstream myfile (path.c_str() , ios::in|ios::binary|ios::ate);
vector<char> totalReply;
totalReply.insert(buffer.end(), reply.begin(), reply.end());
// need a NUL character here?: totalReply.push_back('\0');
totalReply.insert(buffer.end(), istream_iterator(myfile), istream_iterator());
send(client, &totalReply[0], totalReply.size(), 0);

答案 1 :(得分:0)

您没有提及如何打开文件,请确保您已在二进制模式下打开,否则搜索所有内容将无法正常使用新行字符。

即。 myfile.open( "yourfile", ios::binary|ios::in )