伊莉討論區

標題: (已解決) system的刮號中輸入cmd的語法卻無法執行 [打印本頁]

作者: opchta    時間: 2015-6-14 08:04 AM     標題: (已解決) system的刮號中輸入cmd的語法卻無法執行

本帖最後由 snowflying 於 2015-7-24 01:24 AM 編輯

各位大大好,
小弟現在要利用C寫一個程式,去呼叫在G槽的執行檔midicsv去轉檔,而midicsv的必需用cmd執行,其語法如下:
midicsv.exe test.mid >test.csv
其中test是我要轉檔的檔案名稱

但我利用C寫後卻不能執行,我的寫法如下:
system("G:\\midicsv\\midicsv.exe test.mid >test.csv")
請問是什麼原因呢?

小弟要這樣做是因為小弟修了一堂資料探勘的課,期末報告要分析音樂檔,看看裡面哪些音符最常出現,在分析前我需要先將midi轉成csv。現在我要分析三十首歌,要把他們全都轉為csv,我想先把它們都改成數字檔名,再用迴圈再加上把數字轉成字串,搭配system去執行三十次,請問這樣可行嗎?
我有去爬過文,但都沒看到system的相關用法,請問各位大大可以給點相關建議嗎?
或是有什麼更好的做法?
作者: snowflying    時間: 2015-6-14 04:27 PM

本帖最後由 snowflying 於 2015-6-14 04:27 PM 編輯

midicsv.exe test.mid >test.csv

這表示 midicsv.exe 、 test.mid 以及 test.csv 都是在同一個路徑底下 (或者由環境變數取得)
那為何 system("G:\\midicsv\\midicsv.exe test.mid >test.csv")
只有指定第一個的路徑在 G:\\midicsv\\  ?

而 "不能執行" 又是什麼情形
程式開不起來?
找不到檔案?
出現錯誤訊息?

作者: opchta    時間: 2015-6-14 11:43 PM

本帖最後由 opchta 於 2015-6-15 04:30 PM 編輯
snowflying 發表於 2015-6-14 04:27 PM
midicsv.exe test.mid >test.csv

這表示 midicsv.exe 、 test.mid 以及 test.csv 都是在同一個路徑底下 ( ...

是在同一個資料夾下,會那樣寫是因為在下載midicsv這個程式的時候,作者有叮嚀使用者們,要先移動到midicsv所在的資料夾,才可以執行midicsv.exe,我也試過了,若打開cmd的時候馬上打:
midicsv.exe test.mid >test.csv
cmd將會顯示:「midicsv非外部或內部指令」,所以我才會打那樣。

不好意思,不能執行的狀況我沒解釋清楚!
我是用Dev C 寫的,當我編譯後出現了cmd的視窗,cmd的視窗上顯示:
G:\midicsv\midicsv.exe : Unable to to open MIDI inpute file test.mid

補充內容 (2015-6-14 11:50 PM):
midicsv是那個轉檔程式的名字,test.midi是待轉檔的檔案,test.csv是test.midi轉檔後的檔案(也就是將test.midi轉成test.csv)
作者: snowflying    時間: 2015-6-15 12:04 AM

opchta 發表於 2015-6-14 11:43 PM
是在同一個資料夾下,會那樣寫是因為在下載midicsv這個程式的時候,作者有叮嚀使用者們,要先移動到midic ...

我的意思是

midicsv.exe
test.mid

的路徑各是在哪?

而你當前所在路徑 (即執行這個 .c 編出來的執行檔) 又是在哪?
作者: samou568    時間: 2015-6-15 08:03 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: opchta    時間: 2015-6-15 04:25 PM

snowflying 發表於 2015-6-15 12:04 AM
我的意思是

midicsv.exe

midicsv.exe與test.mid都在G:\midicsv
而執行這個編譯出來的執行檔的路徑在D:\
作者: snowflying    時間: 2015-6-15 05:55 PM

opchta 發表於 2015-6-15 04:25 PM
midicsv.exe與test.mid都在G:\midicsv
而執行這個編譯出來的執行檔的路徑在D:\

把那兩個檔案附上來吧
如果不是路徑問題的話,問題應該會是出在 midicsv.exe
作者: opchta    時間: 2015-6-15 11:09 PM

本帖最後由 opchta 於 2015-6-15 11:12 PM 編輯
snowflying 發表於 2015-6-15 05:55 PM
把那兩個檔案附上來吧
如果不是路徑問題的話,問題應該會是出在 midicsv.exe ...

就是下面這兩個檔案,其中midicsv-1.1.tar.gz是主要檔案,雖然它是在linux環境下的壓縮檔,但可以直接解壓縮(我是使用ALzip解壓縮)。midicsv-1.1.zip是為了讓midicsv可以在windows下執行的補丁,當我們解壓縮完midicsv-1.1.tar.gz後,在解壓縮的資料夾中將midicsv-1.1.zip解壓縮,覆蓋掉原本的檔案就可以在windows的環境下執行了。在midicsv-1.1.tar.gz解壓縮完的資料夾中,有一個test.midi,那是作者給我們的測試檔,我在cmd中輸入midicsv.exe test.mid >test.csv後可以順利將test.mid轉成test.csv,但若用C語言呼叫就會出問題。麻煩S大看一下了!
感恩大大~!

midicsv-1.1.tar.gzhttps://drive.google.com/file/d/0BwtxmZX0wuoqTW1MRjdDanJRUEE/view?usp=sharing

midicsv-1.1.zip
https://drive.google.com/file/d/ ... G8/view?usp=sharing



作者: snowflying    時間: 2015-6-16 01:00 AM

opchta 發表於 2015-6-15 11:09 PM
就是下面這兩個檔案,其中midicsv-1.1.tar.gz是主要檔案,雖然它是在linux環境下的壓縮檔,但可以直接解壓 ...

應該是路徑問題
單單把 .c 編譯完的執行檔
丟到與 Midicsv.exe 同一個目錄底下
也就是說,該執行檔與  Midicsv.exe 以及 test.mid 在同一個路徑


[attach]109231516[/attach]


原本沒有 test.csv



[attach]109231517[/attach]



執行 run.exe (就是 run.c 編譯完產生的執行檔)
就出現 test.csv 了


[attach]109231518[/attach]



內容看起來也沒問題


[attach]109231519[/attach]



就算都在不同目錄,只要路徑對了,無論怎麼弄,都沒看到失敗
5 樓的答案跟我想的一樣
你確定
G:\\midicsv\\midicsv.exe
G:\\midicsv\\test.mid
這兩個路徑都是對的?
有沒有先測過執行 system("G:\\midicsv\\test.mid");
能不能成功執行檔案?


作者: opchta    時間: 2015-6-16 07:10 PM

本帖最後由 opchta 於 2015-6-16 07:13 PM 編輯
snowflying 發表於 2015-6-16 01:00 AM
應該是路徑問題
單單把 .c 編譯完的執行檔
丟到與 Midicsv.exe 同一個目錄底下

我把檔案都放到同一個路徑
[attach]109244641[/attach]

但還是一樣的結果
[attach]109244643[/attach]

這是我的程式碼
[attach]109244642[/attach]

我有呼叫過test.mid
[attach]109244644[/attach]但我不知道上面這個情形算不算失敗?QAQ

作者: snowflying    時間: 2015-6-16 07:24 PM

本帖最後由 snowflying 於 2015-6-16 08:18 PM 編輯
opchta 發表於 2015-6-16 07:10 PM
我把檔案都放到同一個路徑

你的 test.mid 就不在那路徑下呀
不是 test.csv
是 test.mid

圖片中就沒看到那個檔案了
作者: opchta    時間: 2015-6-16 09:10 PM

snowflying 發表於 2015-6-16 07:24 PM
你的 test.mid 就不在那路徑下呀
不是 test.csv
是 test.mid

!!!!!!!!!
可以了
原來是我搞了一個烏龍,真抱歉|||orz
非常感謝你們!

那請問如果我要執行這個system的指令很多次,而且每次都不同檔名要怎麼做會比較好?
因為期末報告要分析音樂檔,看看裡面哪些音符最常出現,在分析前我需要先將midi轉成csv。現在我要分析三十首歌,要把他們全都轉為csv,我想先把它們都改成數字檔名,再用迴圈再加上把數字轉成字串,搭配system去執行三十次,請問這樣可行嗎?
我有去爬過文,但都沒看到system的相關用法,請問大大有什麼建議嗎?
作者: snowflying    時間: 2015-6-16 10:24 PM

本帖最後由 snowflying 於 2015-6-16 10:24 PM 編輯
opchta 發表於 2015-6-16 09:10 PM
!!!!!!!!!
可以了
原來是我搞了一個烏龍,真抱歉|||orz

先生出要執行的字串

比方說有 test001.mid~test100.mid
對應過去是 test001.csv~test100.csv

因為 printf 加括號會被視為敏感字詞
所以有兩行 define
實際上是不用這樣的

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define print printf
  4. #define sprint sprintf

  5. int main()
  6. {
  7.     int i;
  8.     char arr[256];
  9.    
  10.     for(i = 1 ; i <= 100 ; ++i)
  11.     {
  12.         sprint(arr , "midicsv.exe test%03d.mid > test%03d.csv" , i , i);
  13.         print("%s\n" , arr);
  14.     }
  15.     return 0;
  16. }
複製代碼


輸出只是確認產生的字串對不對
要執行的話,就將 print 那行,換成 system(arr);







歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!