2014-11-17 2 views
-1

Итак, моя проблема: мне нужно получить некоторые примитивные значения (float) из файла, который я использовал и проанализировал в Java, на мой код C (тестирование между реализацией Java и C). Поэтому в Java я использовал ByteBuffer.allocate() для получения байтов и Files.write(), чтобы записать их в файл. Файл выглядит нормально, я проверил его с помощью Hex Editor (реальные значения, а не только ноль). Сейчас в C, для чтения данных я использовал:fread() read zero values ​​

float * floatArray = malloc(numData * sizeof(float)); //numData is int, 1000 for example 
FILE * stream = fopen(input, "rb"); //input is the name of my binary file 
rewind(stream); 
fread(floatArray, numData, sizeof(float), stream); 
fclose(stream); 

и для теста:

for(i = 0; i < 128; i++) { 
    printf("%f, ", floatArray[i]); 
} 

, но единственное, что я вижу, это

0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.00000000, + next 114 zeros 

Для получения более подробной информации:

Входной файл имеет значение 158 МБ. На самом деле у него много нулей, но, например, первые 3 числа должны быть 9, 52 и 29. Другое дело, что я уже проверил возвращаемое значение fread и вернул правильное значение (numData). Я проверил другие вопросы на сайте, но я действительно не нашел свою проблему. У других были проблемы, например, они установили индикатор файла с fseek в конце файла, когда они получили все нули. Я думаю, это не может быть проблемой, связанной с энтерией, потому что я думаю, что получаю плохие значения, а не только нулевые. Я использую Visual C++ 2008 Express в Windows 7.

Извините за мое форматирование и английский, это мой первый вопрос. Я буду благодарен за любую помощь.

+0

Является ли 'floatArray' то же самое в for-loop? – BLUEPIXY

+0

'input - это имя моего двоичного файла'. Вы уверены, что смогли открыть его? Все нули * могут * указать, что файл не читался. Проверьте возвращаемые значения на 'fopen', удалите это' rewind' (вам это не нужно) и проверьте возвращаемое значение 'fread'. – usr2564301

+0

Я просто попробовал 'if (stream == NULL) printf (« Ошибка »);' и не была напечатана ошибка – ZidaneT

ответ

0

Так что я наконец-то решил. Проблема была в endianess все время. Я не видел этого, потому что значения, которые я читал, были Denormal numbers, и мой компилятор по умолчанию обрабатывал их как ноль. Поэтому я переключил байтовые заказы на Java для генерации нового двоичного файла для использования в C, и он отлично работает.

0

Похоже, вы поставите размер и рассчитывайте в обратном порядке (http://en.cppreference.com/w/c/io/fread)

size_t fread(void *ptr, size_t size, size_t count, FILE *stream) 

Если частичный элемент считывается, его значение является неопределенным

+0

Вы правы. Но дело не только в том, что данные становятся 0. – BLUEPIXY

+0

Это неопределенно, поскольку он читает только его часть. Просто обновил свой ответ с более правильной ссылкой c – Kostya

+0

Размер, который нужно читать в целом, тот же. Не должно быть «только его частью». также Не связано с последовательностью аргументов, которые не читаются. – BLUEPIXY