3

C++でWebサーバーを作成するためのクラスプロジェクトがあります。画像やPDFをホストする必要があり、その時点でファイルが破損するまで、すべてが順調に進んでいます。さらに掘り下げてみると、破損したすべての画像の最後までにヌル文字が含まれていることがわかりました。

それは私の質問に私をもたらします。これらのファイルを読み取ったchar*があり、ファイルの長さを知っています。ファイル全体が読み込まれていることは確かですが(以下のコード)、印刷または送信する方法がわかりません。char*に続く最初のX文字を送信したいことをC++に伝えるにはどうすればよいですか?(答えはここかウェブのどこかにあると確信しています。答えを見つけるための正しい方法で私の質問を表現することができないようです)

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の場合、ファイルの最初の部分(最初のヌル文字の前の部分)のみを印刷します。ファイル全体を印刷するにはどうすればよいですか?

編集:明確にするために、私の最終目標は、ファイルを再保存するのではなく、これをWeb経由で送信することです。

// 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

問題は、nullで終了するASCII文字列であるとostream& operator<< (ostream& out, const char* s );想定していることです。そのため、キャラクターsに遭遇するとすぐに停止します。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

ファイルを開く方法について言及しなかった場合は、バイナリモードで開いたことを確認してください。そうしないと、シークなどが改行文字で正しく機能しません。

すなわちmyfile.open( "yourfile", ios::binary|ios::in )

于 2012-10-26T10:12:30.097 に答える