我试图用c语言编写一个程序来读取mtx文件(mtx代表midi到text,它实际上是一个txt文件),并且只存储我需要的信息(特别是便笺/关闭和音调弯曲消息),下面是一个例子:

我需要的信息是:时间(第一个数字)、类型(On、Off和Pb)、"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;在输出时,它每行打印4个零(数组初始化为0),然后开始发出随机的大数,然后继续打印零,然后停止,VS (2013)发出“未处理的exeption”警报消息。我做错了什么?任何帮助都将不胜感激。
发布于 2015-06-10 21:54:20
OP的代码问题包括:
1)在fscanf(read_from, " ch=1 n=%d v=%d", array[u][2], array[u][3]);中传递变量,而不是变量的地址
2)空间读取"Off"与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;
}https://stackoverflow.com/questions/30767269
复制相似问题