Re: [問題] 想請問各位先進一個開檔的問題

看板C_and_CPP (C/C++)作者時間16年前 (2009/03/10 11:33), 編輯推噓3(306)
留言9則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《wansincere (阿洵)》之銘言: : 各位先進午安。 : 我是新手個人自學所以有些觀念可能錯很大 : 以下如果有太離譜的地方還請各位先進不吝指教,謝謝。 : 說明有點長,我的問題在最後。 : 我試著寫一支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"); 改成這樣: int itdir=argc-1; char* tmp; FILE* input; FILE* output; mkdir(argv[itdir]); for(a=1;a<=argc-2;a++) { tmp=malloc(strlen(argv[itdir])+strlen(argv[a])+1); //配置記憶體 strcpy(tmp,argv[itdir]); //複製資料夾名稱 strcat(tmp,"/"); //接上 "/" strcat(tmp,argv[a]); //把檔名接上去 input=fopen(argv[a],"r"); //開啟輸入檔 output=fopen(tmp,"w"); //開啟輸出檔 . . . //資料複製 fclose(input); fclose(output); free(tmp); } ... 大致上長這樣,有錯誤請指正 XDD : 這麼做有一個大問題 : 就是傳出的檔名會變這樣: 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.如果都不行的話,還請各位先進給我一點提示,謝謝(鞠躬) -- Coding 日誌 & Linux 使用心得 Rinoworks Blog http://rinoworks.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.32 ※ 編輯: Bencrie 來自: 140.121.197.32 (03/10 11:34)

03/10 11:43, , 1F
原來如此,Bencrie前輩給了我很大的啟示
03/10 11:43, 1F

03/10 11:45, , 2F
實在是太感謝了,朝聞道午吃飯可矣^^"
03/10 11:45, 2F

03/10 11:47, , 3F
聽君一席話勝讀十本書,您的回應就好像黑暗中的一盞明
03/10 11:47, 3F

03/10 11:48, , 4F
我不知道該如何表達我的感謝,謝謝
03/10 11:48, 4F

03/10 11:52, , 5F
我測試您的作法確實成功了
03/10 11:52, 5F

03/10 15:55, , 6F
用sprintf看起來比較直覺XD
03/10 15:55, 6F

03/10 15:56, , 7F
sprintf(tmp, "%s/%s", argv[itdir], argv[a]);
03/10 15:56, 7F

03/10 17:06, , 8F
忘記還有sprintf可以用 XDD
03/10 17:06, 8F

03/11 16:17, , 9F
sprintf確實很好用(筆記)
03/11 16:17, 9F
文章代碼(AID): #19jT-WNb (C_and_CPP)
文章代碼(AID): #19jT-WNb (C_and_CPP)