![](/img/trans.png)
[英]C++ How to read first user argument using argv[1] and store it in a string to read/write text files
[英]how to read image files and store it in memory(std::string) in c++?
我今天大部分時間都在線研究,但找不到答案,所以我轉向stackoverflow提出一些建議。
基本上,我有一個c ++庫,使用curl執行PUT方法上傳圖像文件。 現在這個庫為數據采用std :: string。 我在本地磁盤上有圖像文件(如jpg,gif,png)。
我不關心文件的內容(因為,除了將其傳遞給PUT方法的庫之外,我不做任何事情)。 我怎樣才能讀取圖像文件並將其存儲在std :: string中? 如果文件內容包含NULL終止符怎么辦?
我試圖添加一些我嘗試過的代碼,但我是新來的,我不知道如何以正確的格式粘貼我的代碼。 任何幫助,將不勝感激。
我能想到的最簡單的方法。 以二進制模式打開文件,然后將整個內容讀入stringstream
。
std::ifstream fin("foo.png", std::ios::in | std::ios::binary);
std::ostringstream oss;
oss << fin.rdbuf();
std::string data(oss.str());
std::ifstream fin("foo.png", std::ios::binary);
std::string data;
data.reserve(1000000);
std::copy(std::istreambuf_iterator<char>(fin),
std::istreambuf_iterator<char>(),
std::back_inserter(data));
您可以使用這樣的代碼將圖像文件讀取到std::string
。 將reserve
方法的參數調整為大於文件大小的99%。 使用ifstream
和string
正確處理零字節(您調用NULL終止符)。
我發現了一篇很好的文章 ,其中比較了幾種二進制文件加載方法。 這是該文章中最快的方法:
std::ifstream fin("foo.png", std::ios::binary);
fin.seekg(0, std::ios::end);
std::string data;
data.resize(fin.tellg());
fin.seekg(0, std::ios::beg);
fin.read(&data[0], data.size());
這是最短的一個:
std::ifstream fin("foo.png", std::ios::binary);
std::string data((std::istreambuf_iterator<char>(fin)),
std::istreambuf_iterator<char>());
更新
像這樣的東西可以用來提供回調函數(我沒有測試它):
std::ifstream fin("foo.png", std::ios::binary);
fin.seekg(0, std::ios::end);
...
curl_easy_setopt(m_ctx, CURLOPT_INFILESIZE, fin.tellg());
curl_easy_setopt(m_ctx, CURLOPT_READDATA, (void *)&fin);
fin.seekg(0, std::ios::beg);
...
static size_t put_callback(void *ptr, size_t size, size_t nmemb, void *data){
std::ifstream* in = static_cast<std::ifstream*>(data);
if(in->eof()) return 0;
in->read((char *)ptr, size*nmemb);
return in->gcount();
}
這就是庫如何進行PUT調用,其中'data'是作為文件內容傳入的字符串
stringstream data_stream.str(data.c_str());
curl_easy_setopt(m_ctx, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(m_ctx, CURLOPT_PUT, 1L);
curl_easy_setopt(m_ctx, CURLOPT_INFILESIZE, data.length());
curl_easy_setopt(m_ctx, CURLOPT_READFUNCTION, put_callback);
curl_easy_setopt(m_ctx, CURLOPT_READDATA, (void *)&data_stream);
curl_easy_setopt(m_ctx, CURLOPT_WRITEFUNCTION, get_callback);
curl_easy_setopt(m_ctx, CURLOPT_WRITEDATA, (void *)&m_request_response);
這是curlopt_readfunction的回調函數
static size_t put_callback(void *ptr, size_t size, size_t nmemb, void *data){
stringstream *output_stream;
int retval;
output_stream = (stringstream *) data;
if(output_stream->eof()) return 0;
retval = min(size*nmemb,output_stream->str().size());
output_stream->read((char *)ptr, retval);
//return the number of bytes processed
return retval;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.