[問題] 讀寫檔 以及分割問題

看板C_and_CPP作者 (白飯)時間14年前 (2011/11/14 22:00), 編輯推噓1(1035)
留言36則, 7人參與, 最新討論串1/1
爬文很多資料 但沒辦法實作出來自己想要的 一直debug失敗= = 雖然讀寫檔實作很多例子了 不過這次 有幾個問題一直很困擾 分別列出來請益高手 1.固定長度切割字串 據我所知在C語言裡只有strtok才能辦到分割的 這種方法是利用字串中指定符號來切的,感覺沒辦法固定長度 格式如下 strtok(變數1,變數2) 變數1=欲要切割的字串 char* 變數2=切割指定符號(例如空格,tab等等) 例如 char *a; string k="12345 qwer" a=strtok((*char)k.c_str()," ") 結果a=12345 但我要的是讀一行字串再把字串分每個字元放再個別放陣列 例如string a="12345. qwe" 切完後 b[0]="1"....b[5]="."...b[6]=" "類推 要什麼切法= =? 本來利用string特性可以任意合併改變陣列大小(讀每行都合併起來) 但接著把它1個1個字元分開好像有點難... 2.如果問題1沒辦法的話 還有一個想法就是直接一次讀一個 我發現小筆資料可以讀,但遇到大資料直接爆掉(都可編譯過)= = 不知道是指標記憶體問題還是讀檔問題... 例如 ifstream fin; fin.open("input.txt"); char *tmp;int count=0; while(fin>>tmp[count]){ count++;} 3.如果利用一次讀一行切割再讀下一行(還是要分成每個字串切成一個字元) 也就是類似問題1 (與問題1不同的地方在於問題1是直接合併所有資料再分割1個字元的) 例如 string a,b; while(getline(fin,a,"\n")){ b+=a;} 可以改善問題2讀取大資料(但就卡在分割了) 還是沒辦法實作... 抱歉問題有點多QQ 因為要實作LCS= =我懂原理,但卡讀寫檔部分... 就類似把兩份txt文章比較之類 最後有請高手了,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.204.43

11/14 22:05, , 1F
11/14 22:05, 1F

11/14 22:05, , 2F
1. 你試試 string k="abc"; cout << k[1];
11/14 22:05, 2F

11/14 22:05, , 3F
切都不用切
11/14 22:05, 3F

11/14 22:06, , 4F
第二個問題:tmp根本沒分配空間 (置底第3戒)
11/14 22:06, 4F

11/14 22:07, , 5F
第三個問題 抱歉我看不懂你在問什麼
11/14 22:07, 5F

11/14 22:09, , 6F
LCS? longest common sequence?
11/14 22:09, 6F

11/14 22:13, , 7F
切割字串... 迴圈就可以切了呀...
11/14 22:13, 7F

11/14 22:19, , 8F
耶!感謝各位大大解惑 我大概了解一下了 來去debug
11/14 22:19, 8F

11/14 22:51, , 9F
為什麼都裝到string,裡面了,還要特地換成array o_0?
11/14 22:51, 9F

11/14 23:20, , 10F
借標題問另一種問題
11/14 23:20, 10F

11/14 23:20, , 11F
double temp; cin>>temp; cout<<temp;
11/14 23:20, 11F

11/14 23:21, , 12F
我的temp只是要輸出而已,有辦法把三行合在一起嗎?
11/14 23:21, 12F

11/14 23:21, , 13F
就是說讀入的直接輸出,不用再用一個temp暫存
11/14 23:21, 13F

11/14 23:21, , 14F
我用cin.get()讀入的都直接是string
11/14 23:21, 14F

11/14 23:28, , 15F
樓上的我只知道 http://codepad.org/Zx3zK6SW
11/14 23:28, 15F

11/14 23:28, , 16F
不過我不知道要怎麼讓它只跑一次...XD
11/14 23:28, 16F

11/14 23:36, , 17F
輸入完以後按ctrl-d (*nix) 或ctrl-z (win) ?
11/14 23:36, 17F

11/14 23:36, , 18F
我其實是要用在傳參數的,現在都是用暫存,想說應該
11/14 23:36, 18F

11/14 23:37, , 19F
有更漂亮的寫法
11/14 23:37, 19F

11/14 23:37, , 20F
聽起來我提供的應該不合你的意 XD
11/14 23:37, 20F

11/14 23:38, , 21F
抱歉...我敘述的不對= =
11/14 23:38, 21F

11/14 23:39, , 22F
想說可能cin有提供內建的,但我怎麼看都沒有...
11/14 23:39, 22F

11/14 23:39, , 23F
沒有直接轉型的= =
11/14 23:39, 23F

11/14 23:41, , 24F
型別在istream_iterator的時候就可以給啊 @@
11/14 23:41, 24F

11/14 23:42, , 25F
越來越不懂diabloevagto要做的是什麼了...XD
11/14 23:42, 25F

11/14 23:55, , 26F

11/14 23:55, , 27F
大概是這個感覺
11/14 23:55, 27F

11/15 00:07, , 28F
那就可以 cout << *(istream_iterator<double>(cin))
11/15 00:07, 28F

11/15 00:07, , 29F
懂你的意思,但我不知道要怎麼改
11/15 00:07, 29F

11/15 00:09, , 30F
啊我沒看到fabs 請自行加上 XD
11/15 00:09, 30F

11/15 00:10, , 31F
所以就是這個樣子 http://codepad.org/dp1c5wvi
11/15 00:10, 31F

11/15 00:10, , 32F
感謝shadow0326,這招我現在才會XD (不過有點冗長)
11/15 00:10, 32F

11/15 00:11, , 33F
可以 typedef istream_iterator<double> i_am_short
11/15 00:11, 33F

11/15 00:11, , 34F
說的也是XD 要想個好名字又要花點腦筋了
11/15 00:11, 34F

11/15 00:19, , 35F
型態是double名字取short不行的啦!!!
11/15 00:19, 35F

11/15 00:29, , 36F
多謝指教!!!
11/15 00:29, 36F
文章代碼(AID): #1EmHxpvf (C_and_CPP)