定義一個變數保存打開檔案的路徑
QString filePath = "E:/ll/采集分析系統/CJXT-V1.0.0.fls"
1、使用FILE讀取該檔案
QFileInfo info(filePath);
QString fileName = info.fileName();
std::string str = filePath.toStdString();
FILE *fp;
errno_t errnoInfo = fopen_s(&fp, str.c_str(), "rb");
char *dataBuffer = new char[info.size()]();
size_t readNumber = fread(dataBuffer, info.size(), 1, fp);
此時,程式將直接閃退,通過列印日志,得到errnoInfo = 22,錯誤碼22代表引數錯誤,
在fopen_s()的3個引數中,只有第二個引數檔案名是我們賦值的,故修改檔案路徑
QString filePath = "E:/ll/ceshi/CJXT-V1.0.0.fls"
再次執行上述讀取檔案操作,程式正常運行,
針對中文路徑造成的程式例外,該怎么處理?
2、解決中文路徑無法讀取
這里提出4種解決方案,如下:
(1)不使用中文路徑,但對于用戶來說,這一操作很難避免,不推薦該方案
(2)放棄C標準庫,使用Qt封裝的QFile
QFile firmwarefile(filePath);
firmwarefile.open(QIODevice::ReadOnly);
QByteArray ba = firmwarefile.readAll();
char *dataBuffer = new char[ba.size()]();
memcpy(dataBuffer, ba.data(), ba.size());
(3)在呼叫fopen前將filePath編碼轉為GBK,但要注意在呼叫fwrite寫入檔案的時候,也要確保寫入的字符編碼和系統編碼一致,否則也會出現亂碼,
(4)放棄fopen_s,改用_wfopen,這個函式接受兩個寬字符型別,函式原型如下:
FILE* _wfopen(const wchar_t* filename, const wchar_t* mode);
引數一表示檔案名,引數二表示打開模式,回傳檔案描述符
更安全一點,使用_wfopen_s,函式原型如下:
_ACRTIMP errno_t __cdecl _wfopen_s(_Outptr_result_maybenull_ FILE** _Stream,
_In_z_ wchar_t const* _FileName,
_In_z_ wchar_t const* _Mode
);
以上4種方案,無論路徑是否含有中文,程式都可正常運行
其中,在方案(4)種,引數型別為wchar_t const*,而我們的檔案路徑為QString,如何轉換?
3、windows下的wchar_t*與QString之間的相互轉換
//QString 轉 const wchar_t*
QString fileName("我是中文abc!");
const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(fileName.utf16());
//const wchar_t* 轉 QString
wchar_t szMsg[100] = {0};
_stprintf(szMsg,L"Connect [%s] failed!",ssid);
QString str1= QString::fromWCharArray(szMsg);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263755.html
標籤:AI
上一篇:Kaggle資料集HR Analytics: Job Change of Data Scientists (XGBoost)
