2016-04-05 5 views
2

Я новичок в программировании на C, выполняя некоторую работу над программой записи MIDI, которая воспроизводит заметки, и, похоже, не может заставить программу читать из файла в мою структуру массив.Чтение из файла в структуру в C

Вот структура:

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 
+2

Просьба указать часть кода, в которой вы открываете файл. – Aeldred

+0

Я сделал сейчас, когда я запустил программу, она говорит, что файл открыт. –

+0

Просьба предоставить первые несколько строк файла «noteRecordFile.txt». –

ответ

2

Есть Несколько вопросов:

Удалите следующие 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 строк, у вас возникнут проблемы. Это остается как упражнение для читателя.

0

Вы уверены в своем файловом формате? Как я вижу, вы читаете заголовок тоже как обычная строка данных ...

Попробуйте прочитать это, может быть, это вам поможет.

MIDI

Вы можете попробовать открывающийся файл как двоичные, я помню, что устранена проблема я имел на некоторых звуковых файлах ...!

Есть ли у вас какие-либо ошибки/предупреждения во время компиляции и выполнения?

+0

Формат файла был в порядке, у sjsam был ответ, но спасибо –

2

Это не будет, потому что вы достигли конца файла на линии:

fseek(filePointer, 0L, SEEK_END); 

вам нужно сбросить указатель файла в начало файла:

fseek(filePointer, 0L, SEEK_SET) 
+0

Спасибо, это оказалось проблемой –

+0

@HarryJordan: это просто проблема _one_. Прочтите мой ответ. –

Смежные вопросы