首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地使用fscanf将所需的信息仅存储在数组中?

如何正确地使用fscanf将所需的信息仅存储在数组中?
EN

Stack Overflow用户
提问于 2015-06-10 21:04:09
回答 1查看 1.2K关注 0票数 3

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

我需要的信息是:时间(第一个数字)、类型(On、Off和Pb)、"n=“值和"v=”值(在音调弯曲信息中只有"v=“值)。我不是C语言方面的专家,我了解基础知识,我的编程是基于本指南本指南的。

下面是我写的代码:

代码语言:javascript
运行
复制
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”警报消息。我做错了什么?任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()等进行扫描。

代码语言:javascript
运行
复制
// 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编号。

代码语言:javascript
运行
复制
  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;
  }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30767269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档