Fw: [問題] 檔案中的字串讀取

看板C_and_CPP作者 (Nice to Meet You~)時間7年前 (2016/12/09 17:45), 7年前編輯推噓9(9038)
留言47則, 10人參與, 最新討論串1/1
※ [本文轉錄自 Programming 看板 #1OIdmi1H ] 作者: RealJustice (Nice to Meet You~) 看板: Programming 標題: [問題] 檔案中的字串讀取 時間: Fri Dec 9 17:40:57 2016 檔案中有一行: key = "????????????????????" ??????? 是一串無規律的binary資料, 只知道最長長度限制. 現在問題是, C code 中要用甚麼函式, 才能正確地把 "???????????" 讀到array中? 目前遇到的難處是, 裡面可能有換行控制碼, 甚至後退控制碼, 還可能有 ", 等等/. 反正每個byte從0x00 ~ 0xff 都有可能, 所以各種字串處理的函式都有問題. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.35.86 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1481276460.A.051.html ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: RealJustice (61.220.35.86), 12/09/2016 17:45:06

12/09 17:47, , 1F
binary資料就不要用字串處理函式去玩它了
12/09 17:47, 1F

12/09 17:48, , 2F
無規律的話是不是連 " 都有,這樣你要怎麼判斷開頭結尾
12/09 17:48, 2F
請問具體要怎麼做呢? 從開檔案的參數就有差別嗎? ※ 編輯: RealJustice (61.220.35.86), 12/09/2016 17:53:34

12/09 17:57, , 3F
fgets 有用嗎
12/09 17:57, 3F

12/09 17:58, , 4F
其實我不明白你的檔案到底是什麼格式
12/09 17:58, 4F

12/09 17:59, , 5F
照你的描述,該行格式完全是搬石頭砸自己腳
12/09 17:59, 5F
來不及了. 本來是能用 .txt 打開的檔案, 偏偏有人在裡面寫了這奇妙的一行. 現在想要另外存檔也行不通. ※ 編輯: RealJustice (61.220.35.86), 12/09/2016 18:02:26

12/09 18:01, , 6F
你至少要講出一個人類能聽懂的parse方法才有辦法寫程式
12/09 18:01, 6F
有 "從檔案結尾往前找" 的函式嗎? ※ 編輯: RealJustice (61.220.35.86), 12/09/2016 18:03:19

12/09 18:03, , 7F
否則我直接告訴你用 fread 去讀你還是 parse 不出來
12/09 18:03, 7F

12/09 18:04, , 8F
那我只能說放棄吧~
12/09 18:04, 8F

12/09 18:05, , 9F
一般要把金鑰放進文字檔都會先轉成字串(比如十六進位)
12/09 18:05, 9F

12/09 18:06, , 10F
想要由後往前找,自己寫個 for loop 就好啦~
12/09 18:06, 10F

12/09 18:07, , 11F
問題是你確定 binary 的部分只有這一處嗎?
12/09 18:07, 11F
對. 就是這一處. ※ 編輯: RealJustice (61.220.35.86), 12/09/2016 18:07:47

12/09 18:08, , 12F
應該說,你確定用到 " 的只有這一處嗎?
12/09 18:08, 12F

12/09 18:09, , 13F
如果不只一對 " 出現,要如何配對
12/09 18:09, 13F
binary data 裡面也有可能含有 " , 所以真的很難做, 才po版問的.... ※ 編輯: RealJustice (61.220.35.86), 12/09/2016 18:15:43

12/09 18:17, , 14F
就無法做啊 結案
12/09 18:17, 14F

12/09 18:25, , 15F
對啊,就算你從檔案後方往前找,還是一樣沒辦法parse
12/09 18:25, 15F

12/09 18:25, , 16F
我建議是把那個亂塞binary不編碼的白癡抓出來揍一頓
12/09 18:25, 16F

12/09 19:24, , 17F
這個檔案現在這個樣子可以做為原來的目的使用嗎?
12/09 19:24, 17F

12/09 19:25, , 18F
不行的話就照樓上說的把塞進去的那個傢伙抓出來要他負責
12/09 19:25, 18F
現在就是不太能使用啊....那串資料拿出來會有漏. ※ 編輯: RealJustice (118.165.28.31), 12/09/2016 21:23:32

12/09 21:26, , 19F
所以這就只有最一開始塞這些 binary 進去的人知道怎麼回事
12/09 21:26, 19F

12/09 21:26, , 20F
抓他出來要他改好
12/09 21:26, 20F

12/09 21:29, , 21F
基本上你們整個程式/系統因為這個 binary 的關係已經崩潰
12/09 21:29, 21F
現況是有些客戶的資料已經這樣存了. 我們不能把這些資料扔了, 必須撈出來. ※ 編輯: RealJustice (118.165.28.31), 12/09/2016 21:44:05

12/10 00:14, , 22F
人眼能parse嗎?
12/10 00:14, 22F
可以. 但是有幾千份, 不能交給人眼做.

12/10 00:19, , 23F
這應該就只能用 fgetc 之類的一個個慢慢讀?
12/10 00:19, 23F

12/10 00:20, , 24F
還是下一行有啥特定的東西嗎? 好比說讀到 "\n 就算結束?
12/10 00:20, 24F
binary data裡面可能會有 \n. 所以這招也沒法直接套用. ※ 編輯: RealJustice (118.165.28.31), 12/10/2016 08:21:26

12/10 09:44, , 25F
加個跳脫字元啊
12/10 09:44, 25F

12/10 09:44, , 26F
或是字串長度寫在前面
12/10 09:44, 26F

12/10 10:04, , 27F
原 PO 現在想問的是這已經是既成事實了要怎麼補救
12/10 10:04, 27F

12/10 10:05, , 28F
個人覺得, 原 PO 你不要去想有沒有哪個 general 做法能用
12/10 10:05, 28F

12/10 10:05, , 29F
既然你的目的是解決你眼前這份爛掉的文字檔
12/10 10:05, 29F

12/10 10:06, , 30F
那就只要找一個你這份文字檔適用的解法就好
12/10 10:06, 30F

12/10 10:06, , 31F
上面 CP64 講的是 " 跟著 \n 兩個 byte
12/10 10:06, 31F

12/10 10:07, , 32F
如果你掃了一下這幾千份爛掉的檔案裡真的都沒有這 pattern
12/10 10:07, 32F

12/10 10:07, , 33F
那它就是一個解法了
12/10 10:07, 33F

12/10 10:07, , 34F
少數有的或許找一個長一點的 pattern 例如 "\n 加下行開頭
12/10 10:07, 34F

12/10 10:08, , 35F
例如如果下一行一定是哪個屬性那就能用了
12/10 10:08, 35F

12/10 10:10, , 36F
簡單說就是, 你要找的不是萬靈丹, 而是要把死馬當活馬醫
12/10 10:10, 36F

12/10 10:44, , 37F
找key = ".*"\nxxx這樣的pattern?
12/10 10:44, 37F
請問可以講得更詳細點嗎? ※ 編輯: RealJustice (118.165.28.31), 12/10/2016 18:58:36 ※ 編輯: RealJustice (118.165.28.31), 12/10/2016 19:00:38

12/10 19:13, , 38F
人眼可以判斷? 可以描述一下人眼怎麼判斷嗎?
12/10 19:13, 38F

12/10 19:14, , 39F
如果你用人眼可以判斷 那代表已經可以找出規則了?
12/10 19:14, 39F

12/11 00:13, , 40F
用regex的方式去找出來, xxx指的是下一個field名稱,.*
12/11 00:13, 40F

12/11 00:13, , 41F
是任意字元
12/11 00:13, 41F

12/11 00:16, , 42F
如果一般的regex lib做不太出來的話,就自己推DFA來切
12/11 00:16, 42F

12/11 00:16, , 43F
出來
12/11 00:16, 43F

12/12 12:16, , 44F
看起來是要做 name = "valuesxx.." 的判斷,如果看到
12/12 12:16, 44F

12/12 12:17, , 45F
key 的這個 name parse,就去啟用特殊判斷,不使用 fgets
12/12 12:17, 45F

12/12 12:19, , 46F
直到你遇到下一個 name = "valuesxxxx" 做結束
12/12 12:19, 46F

12/22 16:58, , 47F
如果資料含換行符號,為何看起來只有一行?
12/22 16:58, 47F
文章代碼(AID): #1OIdqaYZ (C_and_CPP)