[問題] 讀檔:檔案中某欄位有數字和字串

看板C_and_CPP作者 (不認識)時間14年前 (2011/10/27 07:42), 編輯推噓3(3036)
留言39則, 7人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 輸入檔案的第一欄是key_name, 第二欄是key_value. 但問題是key_value包含int, float, 和string. 我想寫出一個參數類別(class Parameter), 其物件parm可以 進行讀檔(parm.readinput())和取值(parm.get_value("key_name"))的動作. 換句話說, parm.get_value("Name")會return字串Mike, parm.get_value("Temperature")會return浮點數20.0, parm.get_value("Time_Step")會return整數100, ...等 但我完全敗給這第二欄位的非固定型別上了, 請各位高手不惜賜教. 餵入的資料(Input): 輸入檔案(input.txt)如下: Name Mike Temperature 20.0 Time_Step 100 Sweep 0 Tolerance 0.01 Interaction 1.5 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 134.76.63.129

10/27 08:39, , 1F
可以用vector型別用一個class,那個class有兩個參數
10/27 08:39, 1F

10/27 08:40, , 2F
第一個參數固定string,第二個用template
10/27 08:40, 2F

10/27 08:41, , 3F
主要問題是在於傳進的第二個參數到底是什麼型態
10/27 08:41, 3F

10/27 08:42, , 4F
不知道有沒有內建函式可以把strin轉成int或double
10/27 08:42, 4F

10/27 08:42, , 5F
有的話可以比對看看轉換過去式不是一樣,是的話型態
10/27 08:42, 5F

10/27 08:42, , 6F
就轉換對了,然後再傳進class當作第二個參數
10/27 08:42, 6F

10/27 08:43, , 7F
剛剛突然想到的,不知道能不能用xd
10/27 08:43, 7F

10/27 08:59, , 9F
http://ppt.cc/2Bz; 這篇好像好點
10/27 08:59, 9F

10/27 09:35, , 10F
get_value 引數是執行時期決定的嗎?
10/27 09:35, 10F

10/27 14:29, , 11F
剛剛試了一下,想不到該怎樣在runtime決定回傳型態
10/27 14:29, 11F

10/27 14:53, , 12F
@p大,引數是在程序中就寫定了.
10/27 14:53, 12F

10/27 14:59, , 13F
@d大:就是回傳型態我無法解決,有想過在一般類別裡面寫一個
10/27 14:59, 13F

10/27 15:00, , 14F
模板函數,但C++似乎辦不到,只能單寫模板類別或模板函數.
10/27 15:00, 14F

10/27 15:07, , 15F
我目前用傳三個參照過去,然後修改,這樣確實可以正
10/27 15:07, 15F

10/27 15:07, , 16F
確轉換,但不太何要求
10/27 15:07, 16F

10/27 15:08, , 17F
也可以直接判斷字串內容,看你的文件內如果是有字母
10/27 15:08, 17F

10/27 15:08, , 18F
就一定不會有數字,這樣可以直接判斷第一個字母是否
10/27 15:08, 18F

10/27 15:08, , 19F
為字母或數字,但最大的回傳問題想不到啊...
10/27 15:08, 19F

10/27 15:14, , 20F
如果用void*指標不知道能不能
10/27 15:14, 20F

10/27 15:14, , 21F
目前只想得到用 union 來做... 不過不是好解法
10/27 15:14, 21F

10/27 15:17, , 22F
還是需要另一個地方去儲存需要的型態
10/27 15:17, 22F

10/27 15:26, , 23F
我想到的是蠻幹法耶 XD http://codepad.org/ZgOXNX2t
10/27 15:26, 23F

10/27 15:30, , 24F
我寫的跟樓上差不多...除了把buf, floating, integer
10/27 15:30, 24F

10/27 15:31, , 25F
用個union包起來 XD
10/27 15:31, 25F

10/27 15:52, , 26F
我想說用try catch http://codepad.org/N225ZC8U
10/27 15:52, 26F

10/27 16:02, , 27F
硬幹+1 http://codepad.org/SNslv2xG 說真的不建議這樣搞
10/27 16:02, 27F

10/27 16:02, , 28F
應該要改設計..
10/27 16:02, 28F

10/27 16:03, , 29F
http://codepad.org/VQpQNgKH 稍微修改過得
10/27 16:03, 29F

10/27 16:07, , 30F
Android的Bundle就很單純的用 getDouble(String key)
10/27 16:07, 30F

10/27 16:07, , 31F
getInt(String key), getString(String key) 來做
10/27 16:07, 31F

10/27 16:08, , 32F
我覺得這樣會比較單純...不用搞得這麼複雜
10/27 16:08, 32F

10/27 16:08, , 33F
Bundle 的 API : http://ppt.cc/e3n0
10/27 16:08, 33F

10/27 16:15, , 34F
推樓上,或者用template式寫法例如get_value<T>(key)也可
10/27 16:15, 34F

10/27 16:19, , 35F
java也有xd
10/27 16:19, 35F

10/27 16:24, , 36F
感謝各位,看似單純的事情其實很難解決.
10/27 16:24, 36F

10/27 17:48, , 37F

10/27 17:50, , 38F
屬性不會有miss的話, 實際上你第一欄是多餘的
10/27 17:50, 38F

10/27 19:34, , 39F
假如不能用人性的思考解決 就改變想法吧...
10/27 19:34, 39F
文章代碼(AID): #1Eg9hbqz (C_and_CPP)
文章代碼(AID): #1Eg9hbqz (C_and_CPP)