从文件中读入 C 中的结构

Reading from file into Structure in C

我是 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

您确定您的文件格式吗? 如我所见,您也将 header 视为普通数据线...

尝试阅读本文,也许会对您有所帮助。

MIDI

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

编译和执行过程中有没有error/warning?

不会,因为您已到达文件末尾:

fseek(filePointer, 0L, SEEK_END);

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

fseek(filePointer, 0L, SEEK_SET)

有几个问题:

删除下面两行,因为它把文件指针指向文件的末尾,我们想从文件的开头开始读取,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 行,您将 运行 陷入困境。这是留给 reader.

的练习