У меня есть проект класса, чтобы сделать веб-сервер на C ++. Все шло хорошо, пока я не добрался до точки, где мне нужно было разместить изображения или PDF-файлы, после чего файлы были повреждены. Проделав еще несколько копаний, я понял, что все испорченные изображения имели нулевые символы до конца.
Это подводит меня к моему вопросу. У меня есть символ *, с которым я прочитал эти файлы, и я знаю длину файла. Я довольно уверен, что весь файл читается (код ниже), но я не знаю, как распечатать или отправить его. Как я могу сказать C ++, что я хочу отправить первые 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);
Проблема в том, что ostream& operator<< (ostream& out, const char* s );
надеется s
быть строкой ASCII с нулевым символом в конце. Так что он останавливается, как только он сталкивается с NUL
персонаж. Если вы действительно хотите записать все данные в консоль, используйте `ostream& написать (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);
вы не упомянули, как вы открываете файл, убедитесь, что вы открыли его в двоичном режиме, иначе search и все не будут работать правильно с символами новой строки.
то есть myfile.open( "yourfile", ios::binary|ios::in )