我想就我在對一個現有程式進行小規模調整時遇到的一個問題得到一些建議。
該程式本身必須:
- 打開一個檔案,最好是逐行閱讀 將這些行打包成
- 將這2個字串
line1和line2插入一個現有的std::map容器 中。
- 然后我可以用
map和其中的資料做更多的事情。
istringstream,然后在':'分隔符上分割成兩個字串。
我的代碼看起來像這樣:
int main()
{
FILE *fpFile;
map<string, string>mapOfPci;
std::string tempBuff=""。
std::string line1="", line2="。
fpFile = fopen(PCI_MAPPING_PATH, "r"/span>)。
if(! fpFile)
return false;
while(getline(fpFile, tempBuff)){
istringstream iSs(tempBuff)。
iSs >> line1;
iSs.ignore(numeric_limits<std::streamsize>::max(), ': ')。
iSs >> line2;
mapOfPci.insert(make_pair(line1, line2)) 。
}
for(const auto & m : mapOfPci){
cout << m.first << " : "/span> << m.second << "
"。
}
fclose(fpFile)。
return(0)。
現在我在編譯器中得到的反饋是:
不匹配的型別 'std::basic_istream<_CharT, _Traits>' 和 'FILE* {aka _iobuf*}' 。
while(getline(fpFile, tempBuff))
在這一點上,我推測這是因為使用了FILE*檔案處理方法。
我可能無法使用C 的std::ifstream, std::fstream,那么在目前FILE*的使用下,是否有什么方法可以進一步推動這個問題呢?
uj5u.com熱心網友回復:
std::getline()期望一個std::istream派生類,像std::ifstream,所以你根本不能把你自己的FILE*傳給它(除非你把它包在一個自定義的std::streambuf派生物件里面,分配給一個標準std::istream物件。std::ifstream使用std::filebuf,它在內部使用FILE*,但是你不能用你自己的FILE*來供應它)。
否則,你可以使用C的getline()函式來代替,但是它不能與std::string一起作業,因為它分配了自己的輸出char[]緩沖區,然后你將不得不釋放它(不過你可以將該緩沖區的內容分配給一個std::string),例如:
#include <iostream>
#include <sstream>
#include <string>
#include <utility>
#include <limit>
#include <cstdio>
using namespace std;
int main()
{
FILE *fpFile = fopen(PCI_MAPPING_PATH, "r"/span>)。
if (! fpFile)
return false。
map<string, string> mapOfPci;
char *tempBuff = nullptr;
size_t size = 0;
int nRead;
while ((nRead = getline(&tempBuff, &size, fpFile)) != -1){
istringstream iSs(string(tempBuff, nRead))。
string line1, line2;
iSs >> line1;
iSs.ignore(numeric_limits<streamsize>::max(), ' :')。
iSs >> line2;
mapOfPci.insert(make_pair(line1, line2))。
free(tempBuff); tempBuff = nullptr;
size = 0;
}
free(tempBuff)。
for(const auto &m : mapOfPci){
cout << m.first << " : "/span> << m.second << "
"。
}
fclose(fpFile)。
return 0;
但是,既然你使用了其他的C 標準類,真的沒有什么理由不使用std::ifstream來代替,例如:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <utility>
#include <limit>
using namespace std;
int main()
{
ifstream fpFile(PCI_MAPPING_PATH)。
if (!fpFile.is_open()
return false。
map<string, string> mapOfPci;
string tempBuff;
while (getline(fpFile, tempBuff)){
istringstream iSs(tempBuff)。
字串 line1, line2;
iSs >> line1;
iSs.ignore(numeric_limits<streamsize>::max(), ' :')
iSs >> line2;
mapOfPci.insert(make_pair(line1, line2)) 。
}
for(const auto & m : mapOfPci){
cout << m.first << " : "/span> << m.second << "
"。
}
return 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/306739.html
標籤:
上一篇:用遞回法尋找向量中的最大值C
