作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] 關於命令列一次讀多個檔案及參數
時間Mon Jan 3 23:23:05 2011
※ 引述《neville123 (nk)》之銘言:
: FILE *stream [512] ;
: void *runner(void* id);
^^^^^
先問一下,你確定你是要 return void* ?
我看你函式實作似乎是只有 void runner(void* id)
: int main(int argc, char *argv[]){
^^^^^^ ^^^^^^^
這裡才是 argc, argv
... 恕刪 ...
: }
: void *runner(void* id){
: (int*)id;
: printf ("%d ", id);
: stream[id] = fopen("argv[id]", "r");
^^^^^^^^^^
這裡推斷,你對 argc, argv, 引數參數 沒有很熟
: ;
: }
--------------------------------------------------------
先簡化你的問題好了, 畢竟你的問題還有牽扯到
function pointer 當引數參數。
如果你的需求只是要取得 argv 的參數列的話,
應該是這麼做
int main(int argc, char **argv)
{
int ix=0;
for(ix=0; ix<argc; ++ix) {
printf("第 %d 個參數為 %s\n", ix, argv[ix]);
}
}
假設您的生成檔為 T.exe
執行時,如果於命令提示字元輸入 T.exe \o \p a.dat b.txt
那麼 argc = 5
argv[0] = T.exe, argv[1] = \o, argv[2] = \p
argv[3] = a.dat, argv[4] = b.txt
於此可以觀查到, argv[0] 將是執行檔名
--------------------------------------------------------
如果你要的動作是像這樣 T.exe 1.txt 2.txt 3.txt 4.txt
然後去開啟 1~4 .txt 進行寫入
那應該是這麼做
#include <stdio.h>
FILE *fp[512];
int main(int argc, char **argv)
{
int iStart=1; // 檔名是從 index 1 開始的
// 一次全開
for(iStart=1; iStart<argc, ++iStart)
fp[iStart-1] = fopen(argv[iStart], "w");
// dosomething
// 一次全關
for(iStart=1; iStart<argc, ++iStart)
fp[iStart-1] = fclose(argv[iStart];
return 0;
}
如果你是要傳到 sub_func 去開啟檔案的話,
你的 sub_func 還要多加二個引數去接 main func 裡面的 argc 和 argv
--------------------------------------------------------
提外話, C/C++ 用 fopen/fstream 指令的話一次最多大概可以開 2048 個檔案
預設最多可開 512 個檔案 (depend on compiler)
vc 可調用 _getmaxstdio 與 _setmaxstdio
512 這個數字可以設定, 不過似乎只能設小, 不能設大,
就算設小, 最小值也要大於等於 FOPEN_MAX
要設大,最大值不能超過 2048 (depend on compiler)
要再開更多檔案的話就要用 open 方式去開
至於 open 可以最多可以開幾個檔的話..
depend on OS
--
YouLoveMe() ? LetItBe() : LetMeFree();
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.142
※ 編輯: tropical72 來自: 180.177.76.142 (01/03 23:36)
→ neville123:謝謝t大 大致上知道可以了解 那想請問 01/03 23:56
→ neville123:如果我在main 裡頭把所有檔案全開之後 那是要怎麼讓 01/03 23:56
→ neville123:sub_func來讀取這些檔案呢? 是把檔名當作參數傳遞嗎? 01/03 23:57
→ uranusjr:不然就用全域變數 01/04 00:02
→ VictorTom:檔案都fopen完了, 就傳FILE*就好, 不用再傳遞檔名; 不然 01/04 00:28
→ VictorTom:就像4F u大說的用全域變數. 建議先用簡單的方法試通了, 01/04 00:28
→ VictorTom:再嘗試去修改優化code:) 01/04 00:29
→ james732:非不得已,我是不建議用全域變數啦 XD 01/04 00:30
推 neville123:真的很謝謝大家這麼熱心回答我的問題 01/04 09:15
→ neville123:受用不盡 ^^ 01/04 09:16