Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Функция Си fread и функция QFile read
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
AD
Ну чтобы лучше понять ошибку вот из MSDN описание fread:
Цитата
Reads data from a stream.

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

Parameters
buffer - Storage location for data
size - Item size in bytes
count - Maximum number of items to be read
stream - Pointer to FILE structure

Return Values
fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count. Use the feof or ferror function to distinguish a read error from an end-of-file condition. If size or count is 0, fread returns 0 and the buffer contents are unchanged.


А вот Qt-шный read():
Цитата
qint64 QIODevice::read ( char * data, qint64 maxSize )
Reads at most maxSize bytes from the device into data, and returns the number of bytes read. If an error occurs, such as when attempting to read from a device opened in WriteOnly mode, this function returns -1.
0 is returned when no more data is available for reading.
See also readData(), readLine(), and write().


Вот как его я использую (Uint = unsigned int)
/// Чтение файла загрузки
    bool LogReader::TRead()
    {
        Uint var = (Uint)1E+6;
        bool bBlock = false, file_read = false;
        vector<LOGRECORD> log;
        time_t before_read, contin_read;        time(&before_read);

        while(fread(&var, sizeof(var), 1, file) > 0 && !feof(file))
        {
            Suint adr = var % 256;
            /// Определение начала/конца одной записи и записывание ее в вектор
        }

        /// Закрываем файл с логом
        Shutdown();    
        return true;
    }


Вот как использую Qt-шный read()

/// Чтение файла загрузки
bool LogReader::tRead()
    {
        char var[4];
        bool bBlock = false, file_read = false;
        vector<LOGRECORD> log;
        time_t before_read, contin_read;        time(&before_read);

        while(_file -> read(var, sizeof(var)) > 1)
        {
            Suint adr = (unsigned int)var % 256;
            /// Определение начала/конца одной записи и записывание ее в вектор
        }

        /// Закрываем файл с логом
        shutdown();
        return true;
    }


Хочу, чтобы код выполнял идентичные действия. Подскажите, пожалуйста, что не так? Как правильно преобразовать значение прочитанное из файла?
SABROG
Цитата(AD @ 22.12.2008, 14:36) *
/// Чтение файла загрузки
        while(_file -> read(var, sizeof(var)) > 1)

А почему больше 1, если метод сообщает об ошибках или конце только при -1 и 0 ? Тогда уж >0.

Цитата(AD @ 22.12.2008, 14:36) *
Хочу, чтобы код выполнял идентичные действия. Подскажите, пожалуйста, что не так? Как правильно преобразовать значение прочитанное из файла?


А в чем вопрос состоит вообще, т.е. что не так с кодом. Предлагаешь проверить его каждому у себя на компьютере ?
AD
Цитата(SABROG @ 22.12.2008, 14:44) *
А почему больше 1, если метод сообщает об ошибках или конце только при -1 и 0 ? Тогда уж >0.

А в чем вопрос состоит вообще, т.е. что не так с кодом. Предлагаешь проверить его каждому у себя на компьютере ?

Да уже разобрался. Просто необходимо было вот так делать:
Uint var = (Uint)1E+6;

while(_file -> read((char*)&var, sizeof(var)) > 0)
{
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.