Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fread не читает весь блок данных, стабильно происходит ferror 
V
    Опции темы
ksili
Дата 10.6.2014, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Пишу парсер WAV-файлов (под Linux, но это неважно). Т.е. прога должна считывать все чанки и выводить их название и размер. 

В общем-то всё это работает. Читаем каждый заголовок чанка в структуру, парсим, выводим инфу, перескакиваем к следующему чанку и т.д.

Неполадки начались, когда я решил чанк data (самый большой, в котором звуковые данные) не проскакивать (при помощи fseek), а читать в массив (при помощи fread), чтобы потом чего-нибудь с ним делать. 
Делаю в общем-то просто: выделяю массив уже известной мне длины и читаю fread'ом в него. Но считывается всегда меньше данных, чем запрошено. Код этого места такой:
Код

        if(dataChunkLen == 0 && strcmp(outBuffer, "data") == 0)    
        {
            dataChunkLen = pChunkHeader->dLen;
            printf("Position in file - %d.\n", ftell(pFile));

            // копируем звуковые данные в один массив (даже если 2 канала)
            data = new char(dataChunkLen);
            stat = fread((void*)data, sizeof(char), (size_t)dataChunkLen, pFile);
            
            printf("Position in file - %d.\n", ftell(pFile));

            if(stat != dataChunkLen)
            {
                printf("Can't seek data chunk (%d bytes read).\n", stat);
                if(ferror(pFile))    printf("ferror\n");
                    exit(-1);
            }
        }    

Тестирую на файлах размера 100-400 Кб, т.е. ничего особенного. 
printf'ы про позицию в файле добавил, уже когда отлаживался, чтобы проверить, реально останавливается на середине блока данных или нет? 
Вывод например такой:
Цитата

Position in file - 44
Position in file - 548
Can't seek data chunk (504 bytes read).
ferror


Всегда попадаю на  ferror. К сожалению, насколько я понял, ferror не позволяет выяснить, что именно за ошибка произошла.

Я сначала грешил на то, что у меня Linux 64-bit стоит в виртуалке. Но я пересобрал под винду (MS VS, 32-bit) не на виртуалке. Ошибка сохраняется. Только количество реально прочитанных байт другое стало. Вообще, это количество всегда одинаково, т.е. это не какая-то блуждающая ошибка, а что-то стабильное.

В чем может быть проблема?


Это сообщение отредактировал(а) ksili - 10.6.2014, 07:04


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 10.6.2014, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



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

Оказывается, при выделении памяти допущена ошибка - скобки не те. Надо так:
Код

data = new char[dataChunkLen];


Вот только, блин, почему ни один из двух компиляторов не подсказал мне, что тут фигня какая-то написана?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
borisbn
Дата 10.6.2014, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(ksili @  10.6.2014,  07:23 Найти цитируемый пост)
 почему ни один из двух компиляторов не подсказал мне, что тут фигня какая-то написана?

Потому, что это - не фигня. Ты выделил память под один char и проинициализировал его значением dataChunkLen.
А вот за что действительно можно поругать компилятор, так это за то, что он не спрашивая твоего мнения привёл тип переменной dataChunkLen (скорее всего unsigned int) к char, потеряв при этом три значащих байта и не сказав ни слова


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ksili
Дата 10.6.2014, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



borisbn, спасибо.

Ну вот никому довериться нельзя


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.