2016-02-27 62 views
-1

因此,我正在嘗試製作一個讀取中間文件的程序,並輸出節點和txt文件中的節點之間的延遲以供進一步使用。然而,我遇到了一些問題。每當我嘗試讀取中間文件時,它只是給我隨機字符。但是我找不到解決問題的辦法。即使用二進制標籤讀取文件也不行。作爲進一步分析的二進制文件讀取中間文件

#include <stdio.h> 
#include <windows.h> 

int main(){ 
    FILE *midi = fopen("myfile.mid","rb"); 
    FILE *txt = fopen("myfile.txt", "w"); 
    char line[40]; 

    if (midi==NULL) 
    { 
     printf("Error"); 
     fclose(midi); 
     fclose(txt); 
     return 1; 
    } 

    while(!feof(midi)) 
    { 
     fgets(line, 40, midi); 
     printf("%s\n",line); 
     fputs(line, txt); 
     Sleep(300); 
    } 

    fclose(midi); 
    fclose(txt); 
    return 0; 
} 

編輯:所以我試着用fread和fwrite來代替,但它仍然給了醫藥「隨機」符號。我剛剛更換與此代碼while循環:

fread(line, 1, 40, midi); 
fwrite(line, 1, 40, txt); 
+0

你不應該用'fgets'讀取二進制數據... – gurka

回答

2

這不是因爲「Windows如何讀取文件」,這是因爲一個MIDI文件不是人類可讀。這不是一個文本文件,而是一種二進制格式,可以讓機器讀取效率更高。將其視爲字符串並將其打印到屏幕上不會輸出任何有意義的內容。

如果您想在您的程序中處理MIDI數據,最簡單的方法是在線查找MIDI解析庫。雖然文件格式並不複雜,但如果您覺得自己喜歡,也可以手動解析它(這對於二進制解析來說是一個很好的學習練習)。您需要的唯一C函數是fread將其讀取到char緩衝區中 - 其餘部分只是循環和數學。

+0

哦,我的錯。謝謝。 我做的undestand二進制和midi不難看,就像你說的,我只是不知道如何讓c讀取它在十六進制或二進制。我的意思是一個二進制或十六進制輸入 – Gensarguy

+0

正如我所說的,fread對二進制數據很有用。請記住像你已經完成的那樣在奇怪的Windows平臺上使用'rb'標誌。請記住直接將數據打印到屏幕上並不會產生任何有用的效果。 –

+0

仍然無法獲得任何二進制輸入,我真的很困惑這一點。我不應該只使用fread和fwrite到其他文檔? – Gensarguy