2012-10-26 20 views
3

我有一個類項目在C++中創建一個web服務器。一切都很順利,直到我到了需要託管圖像或pdf的地步,此時文件已損壞。做更多的挖掘,我意識到所有損壞的圖像在結束之前都有空字符。Char陣列在結束之前包含空字符

這使我想到我的問題。我有一個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); 
+1

如果你的數據不是「弦」,爲什麼您使用的strcpy,等...使用memcpy準備緩衝區內。 –

+1

看起來你不太清楚「C字符串」是什麼。它是一個8位ASCII字符的數組,以\ 0字符結尾。字節數組本身可以更長(對於需要數組長度的函數),但字符串函數*只考慮到第一個\ 0之前的部分(即使數組實際更短,在這種情況下,您會得到緩衝區溢出)。 – hyde

+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); 
+0

我最終的問題是我需要通過網絡發送這個消息,而不是將它寫入文件。 –

+0

嗯 - 你用來「通過網絡發送消息」的API暴露了一個流接口並接受接收基本上是二進制數據的東西;或者它不。在這種情況下,您需要將您的數據(base64,XML)編碼在您身邊,並在接收端進行解碼。 –

+0

添加了我用來發送所有內容的代碼。這可能也是strcat的問題 –

0

你不能不提到你如何打開該文件時,請確保你已經打開在二進制模式下,否則seek et all將無法正確使用新行字符。

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

+0

將該部分添加到代碼塊。感謝您的雙重檢查,雖然。 –

相關問題