2009-11-16 63 views
1

我是新來的,我的英文不太好。對任何不便表示歉意!我正在使用本機代碼(MFC)爲Windows Mobile編寫應用程序。我試圖打開一個文件,這讓我瘋狂。我試着在千元diferent方法來打開它......我真的實現它,但是當我嘗試讀取(freadgetline)程序崩潰不由分說:使用Windows Mobile上的本機代碼讀取文件時出錯

The program 'x' finalize with code 0 (0x0) 

GetLastError()方法,在某些情況下,返回了我183

然後,我把我用來打開文件的代碼:

std::wifstream file(L"\\Archivos de programa\\Prog\\properties.ini"); 
wchar_t lol[100]; 
if (file) { 
    if(!file.eof()) {    
     file.getline(lol,99); 
    } 
} 

它進入的,如果所有的,但函數getline崩潰。


FILE * lol = NULL; 
lol = _wfope n(ruta, L"rb"); 
DWORD a = GetLastError(); 
if (lol != NULL) 
    return 1; 
else 
    return -1; 

它返回1(正確),之後,在以後的函數getline,它的字符串存儲垃圾。但是,它不會崩潰!


fp.open (ruta, ifstream::in); 
if (fp.is_open()) {  
    return 1; 
}else{   
    return -1; 
} 

它進入在返回1,但在執行後函數getline()時崩潰。

我調試的getline()方法,它崩潰的庫fstream,右有:

if ((_Meta = fget c (_File)) == EOF) 
    return (false); 

在if。 fgetc(),我起訴。

我要瘋了!我需要一些線索,請!
該文件的路徑是正確的。首先,因爲在理論上,這些方法打開了文件,其次,我獲得了路徑並且匹配。

強調fread方法也崩潰。

在此先感謝!

PS:
說,當我做任何FOPEN,方法fp.good()返回FALSE我,並且GetLastError返回我183.用另一隻手,如果我用fp.fopen(path, ifstream::in);std::wifstream fp(path);fp.good();返回我TRUE ,並且GetLastError()不會引發任何錯誤(0)。

回答

0

提示:使用Process Monitor工具查看文件系統調用中出現了什麼問題。

通過wifstream接受的路徑缺乏驅動器(「C:」等)(我不知道是什麼ruta變量指向)

除了流問題本身,你可以救自己當使用windows .ini文件時,通過使用GetProfileString和相關函數會產生很多麻煩。

+0

問題是我的應用程序是爲Windows Mobile編程的。在Windows Mobile中沒有驅動器,並且不知道當前目錄。另一點是,我不能使用GetProfileString,因爲它不受支持。我正在爲Pocket PC 2003 SE編程,以使我的應用程序與所有Windows Mobile兼容。我無法使用Process Monitor,因爲我認爲它不適用於Windows Mobile應用程序,不是嗎? 「ruta」是路徑的同義詞。並在其中存儲.ini文件所在的路徑。謝謝你,xtofl。感謝gf,編輯我的帖子。 – Newlog 2009-11-16 12:15:59

+1

沒有用於Windows Mobile的進程監視器......或者我錯了嗎?如果有的話,你可以發佈一個鏈接嗎?我一直都想要這樣一個工具(雖然不夠難以自己寫一個;)) – atzz 2009-11-16 12:38:22

0

我在黑暗中拍攝,但你的描述聽起來像是一個運行時不匹配的故事。檢查MFC和您的項目是否使用相同的運行時鏈接模型(靜態/動態)。如果您動態鏈接到MFC,則限制更嚴格:MFC和您的項目都必須使用動態運行時。

0

我不知道爲什麼,但隨着的CFile類...它的工作原理...

編程的奧祕!

+0

我的猜測是你的文本文件使用UTF-8編碼,但是崩潰的函數是Unicode UTF-16變體。而CFile可能會自動轉換它們..你是否以文本模式/二進制模式打開文件? – 2010-02-17 17:05:59

+0

您應該提供更多詳細信息並接受您自己的答案,或者如果解決問題,請接受其他問題的答案。 – Matthieu 2011-10-25 16:06:14

0

也在黑暗中拍攝。 MFC中不明原因的隨機崩潰通常來自不匹配的消息處理程序原型。 例如,下面的代碼是錯誤的,但它不會在編譯期間生成的任何警告,它可能工作的大部分時間:

ON_MESSAGE(WM_LBUTTONDOWN, onClick) 
... 
void onClick(void) //wrong prototype given the macro used (ON_MESSAGE) 
{ 

//do some stuff 

} 

這裏的原型應該是:

LRESULT onClick(WPARAM, LPARAM) 
{ 
} 

它經常發生當人們有足夠的信心開始手動修改消息映射時。