[英]How to properly use fscanf to store only the needed information in an array?
我正在嘗試用 c 編寫一個程序來讀取 mtx 文件(mtx 代表 midi 到文本,它實際上是一個 txt 文件)並僅存儲我需要的信息(特別是僅音符開/關和彎音消息) 這是一個例子:
我需要的信息是:時間(第一個數字)、類型(開、關和鉛)、“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.