从文件读入C中的Structure

时间:2016-04-05 08:23:27

标签: c midi audio-player

我是C语言编程的新手,在播放音符的MIDI录音程序上做了一些工作,似乎无法让程序从文件中读取到我的结构数组中。

这是结构:

typedef struct
{
    int noteNumber;
    int vel;
    int oscillatorNumber;
    float freq;
} oneNote;

以下是阅读以下内容中的注释的代码:

oneNote notes[2000];

for (count = 0; count < fileSize; count++)
{
    fscanf(filePointer, "%d %d %d\n", &notes[count].noteNumber,
                                      &notes[count].vel,
                                      &notes[count].oscillatorNumber);

    notes[count].freq = ntof(notes[count].noteNumber);
}

打开文件的代码:

filePointer = fopen("noteRecordFile.txt", "r");

if (filePointer == NULL)
{
    printf("Error opening file\n");
}
else
{
    printf("File opened\n");

    fseek(filePointer, 0L, SEEK_END);
    fileSize = ftell(filePointer);
}

只是不存储结构中的数据和数据,如下所示:

Image of debug console

noteRecordFile.txt的前几行:

48 108 0
50 108 0
52 100 0

3 个答案:

答案 0 :(得分:2)

它不会因为你到达文件末尾的行:

fseek(filePointer, 0L, SEEK_END);

您需要将文件指针重置为文件的开头:

fseek(filePointer, 0L, SEEK_SET)

答案 1 :(得分:2)

有几个问题:

删除以下两行,因为它将文件指针放在文件的末尾,我们想在文件的开头读取,ftell将为您提供文件中的字节数而不是行数。

fseek(filePointer, 0L, SEEK_END);
fileSize = ftell(filePointer);

然后你需要这个:

  FILE *filePointer = fopen("noteRecordFile.txt", "r");

  if (filePointer == NULL)
  {
      printf("Error opening file\n");
      exit(1);   // <<< abort program if file could not be opened
  }
  else
  {
      printf("File opened\n");
  }

  int count = 0;
  do
  {
      fscanf(filePointer, "%d %d %d", &notes[count].noteNumber,
                                        &notes[count].vel,
                                        &notes[count].oscillatorNumber);

      notes[count].freq = ntof(notes[count].noteNumber);
      count++;
  }
  while (!feof(filePointer));  // <<< read until end of file is reached
  ...

我们无法在不读取整个文件的情况下知道文件包含的行数,因此我们使用不同的方法:我们只读到文件末尾。

您仍需要添加支票,因为如果该文件包含超过2000行,您将遇到麻烦。这留给读者练习。

答案 2 :(得分:0)

您确定自己的文件格式吗? 正如我所见,您也将标题读作普通数据线......

试试这个,也许它会帮助你。

MIDI

您可以尝试将文件打开为二进制文件,我记得它解决了我在某些声音文件上遇到的问题......!

编译和执行期间是否有任何错误/警告?