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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка ввода-вывода, поиск причины, ошибка чтения файла, не найти причину 
V
    Опции темы
tatan
Дата 22.5.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

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



Не могу найти ошибку ввода-вывода
Упрощая ситуацию:

Код

.....
.....
while (true)
{
    fseek(itsFile, filePos, SEEK_SET);
    std::cout << "Position 1: " << ftell(itsFile) << std::endl; //    здесь всегда правильно устанавливается указатель
    fread(fileBuffer, readCount, 1, itsFile);
    std::cout << "Position 2: " << ftell(itsFile) << std::endl; //    здесь не Position 1 + readCount

};

В какой-то момент, скажем в 25 раз выполнения цикла, после выполнения fread Position 2 совсем не Position 1 + readCount,  a  = <filesize>   
, при этом fread возвращает не 1.
В чем может быть дело?
Ситуаций сильно упростил, на самом деле все сложнее, но может кто что посоветует



PM MAIL   Вверх
JackYF
Дата 22.5.2008, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



В этом куске я как-то ошибок не вижу. Наверное, давай весь код.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
tatan
Дата 22.5.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

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



примерно так

Код

class ADBFile
{
public:
    .....    
    void SetPosition(unsigned long long filePos);
    void ReadBuffer(char* fileBuffer, unsigned int readCount);
    void WriteBuffer(char* fileBuffer, unsigned int writeCount);
    .....
protected:
    FILE* itsFile;
private:
   ...... 
    std::string itsFileName;
};



Есть такой класс

Код

class ADBPagedFile: public ADBFile
{
    ...    
    void DoSomething();

};




Есть такой класс, описывающий работу с произвольной страницей такого файла:

Код

class ADBPage
{
public:
    ADBPage(ADBFile* ownerFile, unsigned long long pageNo, ........, unsigned short pageSize, .........);
    .....
    void WriteData();
    void ReadBuffer();
protected:
    .....
    ADBFile* itsOwnerFile;
    char* itsPageBuffer;
    .....
   unsigned short itsPageSize;
};    




Далее, метод что-то делает
Код


void ADBPagedFile::DoSomeThing()
{
    .....
    bool cont = true;
    ADBPage* p;
    while (cont)
    { 
        p = new ADBPage(this, k, ..........., pageSize);
        //здесь выполняется метод ADBPage::ReadBuffer, который вызывет
        // ADBFile::ReadBuffer(), который и отрабатывает неправильно, как приведено выше

        delete p;        
    };

};


Вот примерно так




PM MAIL   Вверх
JackYF
Дата 22.5.2008, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Ну, как бы здесь не особо много добавилось из непосредственно кода ... Мемчекеры пробовал использовать?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
tatan
Дата 22.5.2008, 23:03 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

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



А что это?
PM MAIL   Вверх
archimed7592
Дата 22.5.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(JackYF @  22.5.2008,  22:59 Найти цитируемый пост)
Мемчекеры
Цитата(tatan @  22.5.2008,  23:03 Найти цитируемый пост)
А что это?

Да, что это за хитровыумный термин такой? smile
Мне тоже интересно!


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
JackYF
Дата 23.5.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Нарвался, ага. С другой стороны, у меня не аббревиатура, так что :p

Мемчекер (memcheker) - инструмент, умеющий отлавливать ошибки с памятью в программе. В качестве примеров могу привести CodeGuard для Borland C++ Builder и valgrind для Unix-like систем.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
tatan
Дата 23.5.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

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



Не знаю, как это может мне помочь. Проверил работу с памятью, вроде все корректно освобождаю. 
А как можно просто узнать причину неправильно выполненного fread? ну так код ошибки или что еще?  
PM MAIL   Вверх
bsa
Дата 23.5.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



tatan, fread не всегда считывает столько, сколько ты просишь. Он считывает сколько может, но не более, чем ты попросил (например, если достигнут конец файла).
По поводу твоего вопроса:
Цитата
RETURN VALUE
       fread()  and  fwrite()  return the number of items successfully read or
       written (i.e., not the number of characters).  If an error  occurs,  or
       the  end-of-file is reached, the return value is a short item count (or
       zero).

       fread() does not distinguish between end-of-file and error, and callers
       must use feof(3) and ferror(3) to determine which occurred.

PM   Вверх
tatan
Дата 23.5.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 31.10.2007

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



Спасибо
PM MAIL   Вверх
archimed7592
Дата 23.5.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(JackYF @  23.5.2008,  12:27 Найти цитируемый пост)
Мемчекер (memcheker) - инструмент, умеющий отлавливать ошибки с памятью в программе. В качестве примеров могу привести CodeGuard для Borland C++ Builder и valgrind для Unix-like систем. 

И ты посмел спросить у новичка, пользовался ли он мемчекером? Бей его, ребята! smile 



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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