Разделители, используемые при извлечении из потока, зависят от действующего в настоящее время locale
. Один (громоздкий) способ изменить поведение при извлечении - создать новую локаль со специальным facet
, в котором вы указываете свои собственные разделители. В приведенном ниже примере новая локаль используется для непосредственного добавления std::stringstream
вместо std::cin
. Часть создания фасета - это в основном копирование / вставка из других ответов здесь, на SO, поэтому вы найдете множество других примеров.
#include <iostream>
#include <locale> // std::locale, std::ctype<char>
// https://en.cppreference.com/w/cpp/locale/ctype_char
#include <sstream> // std::stringstream
#include <algorithm> // std::copy_n
#include <vector> // a container to store stuff in
// facet to create our own delimiters
class my_facet : public std::ctype<char> {
mask my_table[table_size];
public:
my_facet(size_t refs = 0)
: std::ctype<char>(&my_table[0], false, refs)
{
// copy the "C" locales table to my_table
std::copy_n(classic_table(), table_size, my_table);
// and create our delimiter specification
my_table[' '] = (mask)space;
my_table['\t'] = (mask)space;
my_table[','] = (mask)space;
}
};
int main() {
std::stringstream ss;
// create a locale with our special facet
std::locale loc(std::locale(), new my_facet);
// imbue the new locale on the stringstream
ss.imbue(loc);
while(true) {
std::string line;
std::cout << "Enter sentence: ";
if(std::getline(std::cin, line)) {
ss.clear(); // clear the string stream from prior errors etc.
ss.str(line); // assign the line to the string stream
std::vector<std::string> words; // std::string container to store all words in
std::string word; // for extracting one word
while(ss>>word) { // extract one word at a time using the special facet
std::cout << " \"" << word << "\" is " << word.size() << " chars\n";
// put the word in our container
words.emplace_back(std::move(word));
}
if(words.size()>=2) {
std::cout << "The second word, \"" << words[1] << "\", is " << words[1].size() << " chars\n";
} else {
std::cout << "did not get 2 words or more...\n";
}
} else break;
}
}
1) Действительно ли возможно возобновить загрузку файла на клиенте, не используя флэш-память/Java/Silverlight?
Нет. Сам фактический протокол HTTP не поддерживает резюме о частичных загрузках, поэтому даже при использовании флэш-памяти или Silverlight необходимо было бы все еще использовать что-то еще как FTP на сервере.
Я "решил" эту проблему в прошлом путем записи пользовательского клиентского приложения в C#, который разломал файл на маленькие блоки (2meg), передал их отдельно, и затем сервер комбинирует их всех назад вместе.
2) У кого-либо есть некоторый код или ссылка на статью, которая объясняет, как записать HTTPHandler.NET, который позволит передавать потоком загрузку и ajax индикатор выполнения?
В то время как это не решает проблему 'резюме', я использовал SWFUpload на стороне клиента, и это работало блестяще. Это обеспечивает умный файловый браузер (где можно предложить пользователю только jpeg файлы, и т.д.), и загрузите отслеживание прогресса, все, не будучи должен изменить сервер вообще.
Не возможно возобновить загрузку с помощью стандартного элемента управления вводом файла HTML, потому что целый файл отправлен с Запросом HTTP.
Я использовал NeatUpload в прошлом, который дает Вам индикатор выполнения. Это находится под лицензией LGPL, таким образом, Вы не должны платить за него, и это - открытый исходный код.
Ничто больше для добавления о проблеме резюме. Я использовал (и продолжите использовать), telerik radUpload и я довольно удовлетворены им (это может даже использоваться в среднем доверительном режиме, который был довольно важен для меня). Единственная проблема я имел (и не смог зафиксировать), должен загрузить файлы, больше, чем 2 ГБ...
SlickUpload является довольно солидным, и много крупных компаний использует его от того, что говорит сайт.
Возможно, это слишком поздно для вашего проекта, но POW Upload реализовал автоматическую загрузку резюме в своей новой версии. Мы собираемся реализовать это на нашем сайте.