作者wansincere (阿洵)
看板C_and_CPP
標題[問題] 想請問各位先進一個開檔的問題
時間Tue Mar 10 10:58:42 2009
各位先進午安。
我是新手個人自學所以有些觀念可能錯很大
以下如果有太離譜的地方還請各位先進不吝指教,謝謝。
說明有點長,我的問題在最後。
我試著寫一支UNIX下的開檔程式,用C語言寫
main傳入變數的地方是這樣的:
(int argc, char *argv[])
格式是(程式名 檔案來源 輸出目錄)
作用是把來源檔案複製一份到輸出目錄
但是實際執行的時候我不可能一個參數一個參數下
類似這樣:
$:> pname a.txt b.txt c.txt new
應該這樣:
$:> pname *.txt new
因為最後一個參數是輸出的目錄
所以我就把最後一個參數提出來:
int itdir = argc - 1;
mkdir(argv[itdir]);
然後再用for迴圈去抓argc的值:
for(a=1;a<=argc-2;a++){
strcat(argv[itdir],argv[a]);
FILE *file2 = fopen(argv[itdir], "w");
這麼做有一個大問題
就是傳出的檔名會變這樣:
a.txt a.txtb.txt
所以我就想從argv[itdir]下手
清空重抓不太實際,畢竟內容已經被改變了
所以我就想先把他指定給別的變數保留
迴圈中再讀出來,但是讀出來之後記憶體位置沒變內容卻改變了
如果我的參數是./new/,回來變成_/n\ew/
可能不只如此,因為檔案開得亂七八糟
試了多次不得要領我決定改變做法:
size_t length;
length = strlen(argv[itdir]);
先算出目錄參數的長度
strncpy(argv[itdir],argv[itdir],length);
再從迴圈中把他拷貝回原始長度
但是我顯然太天真了,strncpy沒發揮任何作用
我想說可能是參數一參數二不能相同吧,但是從設一個tmp出來也一樣
至此我還在繼續研究
但有幾個問題想請問各位先進
1.有沒有辦法直接讀取argv的最後一個參數?不確定argv數量的時候有沒有
比較正規的作法?
2.fopen可以帶入兩個變數嗎?(fopen(argv[itdir]/argv[a], "w");)
類似這樣的。
3.如果都不行的話,還請各位先進給我一點提示,謝謝(鞠躬)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.31.36.137
1F:推 Bencrie:1.你的想法是ok的,只是你做法有問題。2.NO 03/10 11:18
2F:→ Bencrie:strcat 會把後面的字串接到前面的字串,但是請注意他是直 03/10 11:19
3F:→ Bencrie:接蓋過去。如果你沒有另外配一個空間來存輸出字串的話,會 03/10 11:20
4F:→ Bencrie:造成不可預期的後果。 03/10 11:21
5F:→ wansincere:感謝Bencrie前輩的指教,受益菲淺。 03/10 11:54