作者laertes (伊薩凱<L>)
看板C_and_CPP
標題[問題] 利用fstream寫入unicodestring
時間Sat Dec 28 22:41:08 2013
開發平台(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)
→ laertes:=.= 解決了 12/28 23:20
→ laertes:使用AnsiString(UnicodeString).c_str()即可解決 12/28 23:20
→ laertes:可是我不懂為何使用AnsiString(UnicodeString)不能? 12/28 23:21
→ laertes:會出現ERROR:同上只是UnicodeString換成AnsiString 12/28 23:22
→ laertes:為何一定要加.c_str() 12/28 23:24
→ laertes:再來一個問題是為何要先換成AnsiString 12/28 23:26
→ laertes:直接用.w_str()不能?會變成輸入亂碼 12/28 23:27
→ laertes:.c_str()為將String物件轉換成C語言形式的字串常數 12/28 23:31
※ 編輯: laertes 來自: 220.132.136.194 (12/28 23:37)
→ firose:c_str() UnicodeString 傳回 wchar* AnsiString 傳回 char* 12/29 10:59
→ firose:AnsiString(UnicodeString)負責轉碼而 fstream 不吃 wchar* 12/29 11:00
→ laertes:我的問題是那個轉碼的細節是什麼?為何要先轉 12/29 11:09
→ laertes:AnsiString才不會變成亂碼,那代表的是什麼意思 12/29 11:10
→ laertes:感謝回答... 12/29 11:14
→ firose:你用 debugger 去看轉跟不轉的記憶體內容應該就可看到差異 12/29 11:19
→ laertes:OKOK...感謝 12/29 11:58