3

我有一个类项目来用 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);
4

2 回答 2

1

问题是它ostream& operator<< (ostream& out, const char* s );期望s是一个以 null 结尾的 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);
于 2012-10-26T10:07:01.380 回答
0

you fail to mention how you open the file, make sure you have opened in binary mode otherwise seek et all will not work properly with new line characters.

i.e. myfile.open( "yourfile", ios::binary|ios::in )

于 2012-10-26T10:12:30.097 回答