簡體   English   中英

如何正確使用 fscanf 僅將所需信息存儲在數組中?

[英]How to properly use fscanf to store only the needed information in an array?

我正在嘗試用 c 編寫一個程序來讀取 mtx 文件(mtx 代表 midi 到文本,它實際上是一個 txt 文件)並僅存儲我需要的信息(特別是僅音符開/關和彎音消息) 這是一個例子:mtx 文件示例

我需要的信息是:時間(第一個數字)、類型(開、關和鉛)、“n=”值和“v=”值(在彎音消息中只有“v=”價值)。 我不是 C 語言專家,我知道基礎知識,我的編程基於本指南本指南

這是我寫的代碼:

FILE * read_from;
char status[3];
int u = 0;
int ctrl,ct;
read_from = fopen(nomesong, "r");
if (!read_from)
    printf("NO WAY\n");
else{
while (1){
    ct = fscanf(read_from, "%d", array[u][0]);
    if (ct == 1){
        ctrl = fscanf(read_from, " %s", &status);
        if (ctrl == 1){
            if (status[1] == 'n'){
                array[u][1] = 1;
                fscanf(read_from, " ch=1 n=%d v=%d", array[u][2], array[u][3]);
            }
            else if (status[1] == 'f'){
                array[u][1] = 0;
                fscanf(read_from, " ch=1 n=%d v=%d", array[u][2], array[u][3]);
            }
            else if (status[1] == 'b'){
                array[u][1] = 2;
                fscanf(read_from, " ch=1 v=%d", array[u][3]);
            }
        }
        else if (errno != 0) {
            perror("scanf:");
            break;
        }
        else {
            printf("No match.\n");
        }

    }
    else if (errno != 0) {
        perror("scanf:");
        break;
    }
    else if (ctrl == EOF) {
        break;
    }
    printf("%d %d %d %d\n", array[u][0], array[u][1], array[u][2], array[u][3]);
    u++;
}
}return;

作為輸出,它每行打印四個零(array[][] 初始化為 0)然后開始噴出隨機大數字,然后繼續打印零然后停止,VS(2013)發出“未處理的例外”警報消息。 我究竟做錯了什么? 任何幫助將不勝感激。

OP的代碼問題包括:

1) 傳遞一個變量,而不是fscanf(read_from, " ch=1 n=%dv=%d", array[u][2], array[u][3]);

2) 空間不足,讀取"Off"並帶有char status[3]; ... ctrl = fscanf(read_from, " %s", &status); char status[3]; ... ctrl = fscanf(read_from, " %s", &status);

更好的方法是不使用fscanf() 使用fgets()getline()讀取該行,然后使用sscanf()strtol()等進行掃描。

// Read  line by line until EOF
while (fgets(buf, sizeof buf, read_from)) {
  // Clear entry
  memset(&array[u], 0, sizeof (array[u]));

  if (3 == sscanf(buf, "%d Off ch=1 n=%d v=%d", 
      &array[u][0], &array[u][2], &array[u][3])) {
    array[u][1] = 1;
  } else if (3 == sscanf(buf, "%d On ch=1 n=%d v=%d", 
      &array[u][0], &array[u][2], &array[u][3])) {
    array[u][1] = 0;
  } else if (2 == sscanf(buf, "%d Pb ch=1 v=%d", 
      &array[u][0], &array[u][3])) {
    array[u][1] = 2;
  } 

注意:由於ch=1可能不是常數1 ,代碼可以使用"%*d"來掃描並丟棄ch數。

  if (3 == sscanf(buf, "%d Off ch=%*d n=%d v=%d", 
      &array[u][0], &array[u][2], &array[u][3])) {
    array[u][1] = 1;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM