我是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
答案 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", ¬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行,您将遇到麻烦。这留给读者练习。
答案 2 :(得分:0)
您确定自己的文件格式吗? 正如我所见,您也将标题读作普通数据线......
试试这个,也许它会帮助你。
您可以尝试将文件打开为二进制文件,我记得它解决了我在某些声音文件上遇到的问题......!
编译和执行期间是否有任何错误/警告?