从文件中读入 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", ¬es[count].noteNumber,
¬es[count].vel,
¬es[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);
}
只是没有在结构中存储数据的与,如下所示:
noteRecordFile.txt的前几行:
48 108 0
50 108 0
52 100 0
您确定您的文件格式吗?
如我所见,您也将 header 视为普通数据线...
尝试阅读本文,也许会对您有所帮助。
您可以尝试以二进制方式打开文件,我记得它解决了我在某些声音文件上遇到的问题...!
编译和执行过程中有没有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", ¬es[count].noteNumber,
¬es[count].vel,
¬es[count].oscillatorNumber);
notes[count].freq = ntof(notes[count].noteNumber);
count++;
}
while (!feof(filePointer)); // <<< read until end of file is reached
...
如果不读取整个文件,我们无法知道文件包含的行数,因此我们使用不同的方法:我们只读到文件末尾。
您还需要添加一个检查,因为如果文件包含超过 2000 行,您将 运行 陷入困境。这是留给 reader.
的练习
我是 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", ¬es[count].noteNumber,
¬es[count].vel,
¬es[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);
}
只是没有在结构中存储数据的与,如下所示:
noteRecordFile.txt的前几行:
48 108 0
50 108 0
52 100 0
您确定您的文件格式吗? 如我所见,您也将 header 视为普通数据线...
尝试阅读本文,也许会对您有所帮助。
您可以尝试以二进制方式打开文件,我记得它解决了我在某些声音文件上遇到的问题...!
编译和执行过程中有没有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", ¬es[count].noteNumber,
¬es[count].vel,
¬es[count].oscillatorNumber);
notes[count].freq = ntof(notes[count].noteNumber);
count++;
}
while (!feof(filePointer)); // <<< read until end of file is reached
...
如果不读取整个文件,我们无法知道文件包含的行数,因此我们使用不同的方法:我们只读到文件末尾。
您还需要添加一个检查,因为如果文件包含超过 2000 行,您将 运行 陷入困境。这是留给 reader.
的练习