[問題] 利用fstream寫入unicodestring

看板C_and_CPP (C/C++)作者 (伊薩凱<L>)時間12年前 (2013/12/28 22:41), 編輯推噓0(0015)
留言15則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) BCB 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) #include <fstream.h> 問題(Question): 在"日期-小時-分鐘-秒".text中寫入 日期-小時-分鐘-秒,且1秒加1行。 但好像是無法利用fstream寫入Unicodestring 餵入的資料(Input): 預期的正確結果(Expected Output): 同上 錯誤結果(Wrong Output): [BCC32 Error] Unit2.cpp(30): E2094 'operator<<' not implemented in type 'fstream' for arguments of type 'UnicodeString' 程式碼(Code):(請善用置底文網頁, 記得排版) void __fastcall TForm2::tmr1Timer(TObject *Sender) { if (startsave==true) { f1.open(dlgSave1->FileName.c_str(), ios::in|ios::out|ios::app); (問題出在這行) f1<<FormatDateTime("yyyy-mm-dd AM/PM hh-mm-ss", Now())<<"\r\n"; f1.close(); } } void __fastcall TForm2::btn2Click(TObject *Sender) { startsave=false; dlgSave1->Filter= "Text (*.txt)|*.txt|All Files|*.*|"; dlgSave1->FileName=FormatDateTime("yyyy-mm-dd AM/PM hh-mm-ss",Now());; dlgSave1->DefaultExt=".Txt"; dlgSave1->Execute(); f1.open(dlgSave1->FileName.c_str(),ios::out); f1<<"日期"<<"\r\n"; f1.close(); startsave=true; } 補充說明(Supplement): FormatDateTime("yyyy-mm-dd AM/PM hh-mm-ss",Now()) <=是Unicodestring 所以應該是要轉換成其它的類型,才能用fstream再寫入記事本對吧? 如果加FormatDateTime("yyyy-mm-dd AM/PM hh-mm-ss",Now()).c_str() (或w_str()) 可以成功執行無錯誤,但會出現輸入的不是日期,而是數字或亂碼.... 小弟我新手,不太懂怎麼轉換類型,網路上都寫得看不太懂 不知道有沒有什麼簡單的手法可以處理,感謝回答 -------------------------------------------------------------------------- 解答: 使用AnsiString(UnicodeString).c_str()即可解決 為何一定要加.c_str()是因為fstream無法輸入string 所以要先變成C語言形式的字串常數後,才能使用fstream輸入 那為何要先把UnicodeString換成AnsiString 日期才不會變成亂碼 完全不知道...囧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.136.194 ※ 編輯: laertes 來自: 220.132.136.194 (12/28 22:44)

12/28 23:20, , 1F
=.= 解決了
12/28 23:20, 1F

12/28 23:20, , 2F
使用AnsiString(UnicodeString).c_str()即可解決
12/28 23:20, 2F

12/28 23:21, , 3F
可是我不懂為何使用AnsiString(UnicodeString)不能?
12/28 23:21, 3F

12/28 23:22, , 4F
會出現ERROR:同上只是UnicodeString換成AnsiString
12/28 23:22, 4F

12/28 23:24, , 5F
為何一定要加.c_str()
12/28 23:24, 5F

12/28 23:26, , 6F
再來一個問題是為何要先換成AnsiString
12/28 23:26, 6F

12/28 23:27, , 7F
直接用.w_str()不能?會變成輸入亂碼
12/28 23:27, 7F

12/28 23:31, , 8F
.c_str()為將String物件轉換成C語言形式的字串常數
12/28 23:31, 8F
※ 編輯: laertes 來自: 220.132.136.194 (12/28 23:37)

12/29 10:59, , 9F
c_str() UnicodeString 傳回 wchar* AnsiString 傳回 char*
12/29 10:59, 9F

12/29 11:00, , 10F
AnsiString(UnicodeString)負責轉碼而 fstream 不吃 wchar*
12/29 11:00, 10F

12/29 11:09, , 11F
我的問題是那個轉碼的細節是什麼?為何要先轉
12/29 11:09, 11F

12/29 11:10, , 12F
AnsiString才不會變成亂碼,那代表的是什麼意思
12/29 11:10, 12F

12/29 11:14, , 13F
感謝回答...
12/29 11:14, 13F

12/29 11:19, , 14F
你用 debugger 去看轉跟不轉的記憶體內容應該就可看到差異
12/29 11:19, 14F

12/29 11:58, , 15F
OKOK...感謝
12/29 11:58, 15F
文章代碼(AID): #1IlkC69q (C_and_CPP)
文章代碼(AID): #1IlkC69q (C_and_CPP)