[問題] 關於命令列一次讀多個檔案及參數

看板C_and_CPP (C/C++)作者 (nk)時間15年前 (2011/01/02 17:29), 編輯推噓3(3030)
留言33則, 5人參與, 最新討論串1/2 (看更多)
問題(Question): 我的問題是這樣的 如果今天我在 a.out後面餵了多個參數及檔案 ex: ./a.out p1, p2, p3, txt1, txt2, txt3 .... 因為我在input進來之前並沒有辦法知道會餵了多少個參數及檔案 所以我想請問 是否可以宣告一個檔案指摽的陣列 如: FILE *stream [512] , 這樣子來做 ...... *stream[id] = fopen("argv[id]", "r"); 不過我在fopen的時候卻會發生complier不過的情形 想請問大家問題是出在哪裡 還是說有別的做法也請指教~ 謝謝! 以下是code #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <math.h> FILE *stream [512] ; void *runner(void* id); int main(int argc, char *argv[]){ pthread_t pro[512]; pthread_attr_t attr[512]; int i; for (i=5; i<=7; i++){ pthread_attr_init(&attr[i]); pthread_create(&pro[i], &attr[i], runner, (void*) i); } for (i=5; i<=7; i++){ pthread_join(pro[i], NULL); } } void *runner(void* id){ (int*)id; printf ("%d ", id); stream[id] = fopen("argv[id]", "r"); ; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.243.144.23

01/02 17:31, , 1F
compiler不過?請貼上你的錯誤訊息
01/02 17:31, 1F

01/02 17:34, , 2F
39 C:\Documents and Settings\christian\桌面\test
01/02 17:34, 2F

01/02 17:34, , 3F
.cpp invalid types `FILE*[512][void*]' for array
01/02 17:34, 3F

01/02 17:35, , 4F
subscript
01/02 17:35, 4F

01/02 21:34, , 5F
改成 stream[id] = fopen(argv[id], "r");
01/02 21:34, 5F

01/03 00:35, , 6F
錯誤訊息還是相同耶..@@
01/03 00:35, 6F

01/03 00:39, , 7F
貼一下code
01/03 00:39, 7F

01/03 01:20, , 8F
既然是命令列代參數, argc可以知道參數數量, 雖然這並不
01/03 01:20, 8F

01/03 01:20, , 9F
能明確知道檔案數, 但你可以先跑迴圈把參數parse一遍算
01/03 01:20, 9F

01/03 01:21, , 10F
完, 最後用malloc動態要FILE*出來; 當然如果可以賭一個
01/03 01:21, 10F

01/03 01:22, , 11F
上限, 像你那樣開固定的array也可以, 有錯應該單純是你
01/03 01:22, 11F

01/03 01:23, , 12F
code寫錯了, 比如你 *stream[id] 那行看起來就是錯的,
01/03 01:23, 12F

01/03 01:23, , 13F
應該不要 * 才對; 進一步修正就像1F j大說的貼code吧:)
01/03 01:23, 13F

01/03 13:23, , 14F
好的!! 晚點貼上來, 謝謝大家 :)
01/03 13:23, 14F
※ 編輯: neville123 來自: 111.243.144.218 (01/03 22:56) ※ 編輯: neville123 來自: 111.243.144.218 (01/03 22:56)

01/03 23:11, , 15F
main裡用pthread小弟不熟, 只是loop都只有5~7, 為什麼
01/03 23:11, 15F

01/03 23:11, , 16F
array要開到512個這麼多啊?_?
01/03 23:11, 16F

01/03 23:12, , 17F
runner() function裡錯的滿嚴重的, 比如第一行
01/03 23:12, 17F

01/03 23:12, , 18F
(int*)id; <- 你知道這一行最後會發生什麼事嗎??
01/03 23:12, 18F

01/03 23:13, , 19F
想從argv[]拿出檔名那邊的fopen(), 請再仔細想想這樣寫
01/03 23:13, 19F

01/03 23:14, , 20F
fopen到底會嘗試開啟哪一個檔名; 仔細想想需不需要"".
01/03 23:14, 20F

01/03 23:16, , 21F
最後, runner()好像應該回傳個void*出去喔....:)
01/03 23:16, 21F

01/03 23:17, , 22F
er~~仔細想想, 你這樣子永遠只會以argv[5~7]嘗試當作檔
01/03 23:17, 22F

01/03 23:18, , 23F
名來開檔, 好像沒辦法如你所想的依照參數數量開啟任意檔
01/03 23:18, 23F

01/03 23:19, , 24F
案數說; 至於fopen檔案不過, 純粹是id的型態不對.
01/03 23:19, 24F

01/03 23:48, , 25F
因為我自己在try就先把範圍寫死了
01/03 23:48, 25F

01/03 23:48, , 26F
謝謝 我自己在試試看好了 :)
01/03 23:48, 26F

01/03 23:50, , 27F
#1D8UdSCG 有回文了,可以參考一下
01/03 23:50, 27F

01/03 23:52, , 28F
(int*)id 不是強制轉型成int的嗎??
01/03 23:52, 28F

01/03 23:54, , 29F
謝謝
01/03 23:54, 29F

01/04 00:25, , 30F
它是強制轉型, 但是是轉型成int*, 還有, 只在那個地方轉
01/04 00:25, 30F

01/04 00:26, , 31F
並不是你 (int*)id; 寫一行, 後面id就自動變成新型態了,
01/04 00:26, 31F

01/04 00:26, , 32F
是你每次要把id以新型態解讀時, 都要再做強轉型一次; 不
01/04 00:26, 32F

01/04 00:27, , 33F
然就是宣告一個新的變數, 直接儲存轉型後的結果.
01/04 00:27, 33F
文章代碼(AID): #1D84Lmmz (C_and_CPP)
文章代碼(AID): #1D84Lmmz (C_and_CPP)