我想在c中写一个读取mtx文件的程序(mtx代表midi到文本,它实际上是一个txt文件),并且只存储我需要的信息(特别是只有音符开/关和音调 - 弯曲消息)这里是一个例子: 如何正确使用fscanf只在数组中存储所需的信息?
我需要的信息是:时间(第一个数字),类型(On,Off和Pb),“n =”值和“v =”值(在弯音消息中只有“v =”值)。我不是C语言的专家,我知道基础知识,并基于我的编程 this guide和this guide。
这是我写的代码:
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;
由于其输出打印每行四个零(数组[] []初始化为0),然后开始喷涌而出随机大的数字,然后保持印刷零,然后停止和VS(2013)发出“未处理的豁免”警报消息。我究竟做错了什么?任何帮助将不胜感激。
'状态[3];' - >'状态[4];','的fscanf(read_from, “%S”,&状态);' - >'的fscanf(read_from, “%3S” ,&status);' – chux
我尝试了你的建议,输出相同。 –
'status'变量是一个大小为3的字符数组,但在'ctrl = fscanf(read_from,“%s”,&status);'中,读取'Off'的概率很大,需要4个字节的空间额外字节为NULL字符)。这会导致分段错误。 – Pratap