c - 如何正确使用 fscanf 仅将需要的信息存储在数组中?

标签 c arrays file scanf

我正在尝试用 c 语言编写一个程序来读取 mtx 文件(mtx 代表 midi 到文本,它实际上是一个 txt 文件)并仅存储我需要的信息(特别是仅音符开/关和音高-弯曲消息)这是一个例子: mtx file example

我需要的信息是:时间(第一个数字)、类型(开、关和 Pb)、“n=”值和“v=”值(在弯音消息中只有“v=”值)。我不是 C 语言专家,我知道基础知识,我的编程基于 this guidethis 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;

作为输出,它每行打印四个零(array[][] 初始化为 0)然后开始喷出随机大数字,然后继续打印零然后停止并且 VS (2013) 发出“未处理的异常”警报消息.我究竟做错了什么?任何帮助将不胜感激。

最佳答案

OP的代码问题包括:

1) 在 fscanf(read_from, "ch=1 n=%d v=%d", array[u][2], array[u][ 中传递一个变量,而不是变量的地址3]);

2) 使用 char status[3] 读取 "Off" 的空间不足; ... 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;
  }

关于c - 如何正确使用 fscanf 仅将需要的信息存储在数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30767269/

相关文章:

c - c 中是否有一个函数可以返回一个字符串在另一个字符串中的索引?

java - 为什么 Java 会自动解码 URI 编码文件名中的 %2F?

java - Java如何将数据写入文件中的特定行号

javascript - 使用 Javascript 循环遍历包含图像的目录

对字符数组元素类型的混淆

计算日期(使用有限的工具)

javascript - Map 方法影响除最后一个数组项之外的所有内容

c - 该程序打印 "hello"而不是 "Hi"。如何?

将字符数组复制到文本文件中

javascript - 如何比较2个数组的索引值?