Форум программистов, компьютерный форум CyberForum.ru

fread с непонятной ошибкой - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 20:16     fread с непонятной ошибкой #1
Вот фрагмент кода, который вызывает ошибку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    FILE *t = fopen("squares.db","r");                            
    if (!t) {
        char log[1024];
        sprintf(log, "Error opening squares.db", argv[1]);
        SetReady(log);      
        return 1;
    }
    town_square *town=NULL;                                    
    vector<TOWN_SQUARE> squares;                           
    while (fread(town,sizeof(town_square),1,t)==1) {
        squares.push_back(*town);                               
    }
    fclose(t);
В рантайме вылетает совершенно непонятная ошибка в файле "fread.c". Ругается на строку "(buffer !=NULL)", которой в моем коде и в помине нет. Очевидно, это что-то в fread.c не сработало. Но почему? Что я сделал неправильно?

Добавлено через 1 минуту
Вдогонку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct point_town
{
    float x, y;
    point_town(float _x = 0.0f, float _y = 0.0f) { x = _x, y = _y; }
    bool operator == (const point_town& p){return (this->x == p.x && this->y == p.y);}
    bool operator != (const point_town& p){return !((*this) == p);}
} POINT_TOWN;
 
typedef struct town_square
{
    point_town min,max;
    char file_name[32];
    town_square(point_town _min, point_town _max, char _file_name[32]) { min.x=_min.x; min.y=_min.y; max.x=_max.x; max.y=_max.y; 
      memset(_file_name,0,sizeof(file_name)*sizeof(file_name[0]));
}
} TOWN_SQUARE;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12271 / 6958 / 782
Регистрация: 27.09.2012
Сообщений: 17,259
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 20:32     fread с непонятной ошибкой #2
C++
1
town_square *town=NULL;
У Вас указатель никуда не указывает при передачи его в fread
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 20:38  [ТС]     fread с непонятной ошибкой #3
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
town_square *town=NULL;
У Вас указатель никуда не указывает при передачи его в fread
Не вопрос. Но если я пишу

C++
1
town_square *town;
без инициализации, то получаю (опять же, в рантайме) "The variable 'town' is being used without being initialized"
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12271 / 6958 / 782
Регистрация: 27.09.2012
Сообщений: 17,259
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 20:46     fread с непонятной ошибкой #4
Цитата Сообщение от deGeneral Посмотреть сообщение
без инициализации, то получаю (опять же, в рантайме) "The variable 'town' is being used without being initialized"
fread должен же куда-то записать данные.
Выделите память под эти данные.
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 20:50  [ТС]     fread с непонятной ошибкой #5
Цитата Сообщение от Croessmah Посмотреть сообщение
fread должен же куда-то записать данные.
Выделите память под эти данные.
Извините за тупизм, но как? Вот я объявил:

C++
1
town_square *town;
Это указатель, т.е. байт эдак около 8-ми, надо понимать, уже выделено? Хорошо. Теперь сама структура, на которую указывает данный указатель: конструктор вызвать? Или что-то еще сделать?
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 20:51     fread с непонятной ошибкой #6
Зачем вам здесь указатель? Объявите структуру и читайте туда.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12271 / 6958 / 782
Регистрация: 27.09.2012
Сообщений: 17,259
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 20:52     fread с непонятной ошибкой #7
Цитата Сообщение от deGeneral Посмотреть сообщение
Это указатель, т.е. байт эдак около 8-ми, надо понимать, уже выделено?
Прочитайте еще раз раздел "указатели" в любом учебнике.
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 20:57  [ТС]     fread с непонятной ошибкой #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем вам здесь указатель? Объявите структуру и читайте туда.
Не могу! Тогда компилятор не пропускает: "town_square: нет подходящего конструктора по умолчанию"
Ну что за язык? Как ни напиши, отовсюду палки в колеса...

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Прочитайте еще раз раздел "указатели" в любом учебнике.
Да читал, но толку? Я имел в виду, что память под сам указатель как таковой, уже выделена. А вот под структуру, на которую он указывает... увы-с.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12271 / 6958 / 782
Регистрация: 27.09.2012
Сообщений: 17,259
Записей в блоге: 2
Завершенные тесты: 1
21.11.2012, 20:58     fread с непонятной ошибкой #9
Цитата Сообщение от deGeneral Посмотреть сообщение
Я имел в виду, что память под сам указатель как таковой, уже выделена. А вот под структуру, на которую он указывает...
Отсюда и вопрос - куда будет писать fread данные из файла, если для них не выделено памяти?
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:01  [ТС]     fread с непонятной ошибкой #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Отсюда и вопрос - куда будет писать fread данные из файла, если для них не выделено памяти?
Я грешным делом считал, что это происходит автоматически при первом же обращении к данной области памяти, ан нет...
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:05     fread с непонятной ошибкой #11
Вообще, сам подход бинарного чтения из файла в память (или в память под объектом) неправильный. Читать нужно в поля структуры(объекта). Если нет конструктора по умолчанию, то создавайте объект с помощью конструктора с параметрами, и читайте в поля объекта.
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:10  [ТС]     fread с непонятной ошибкой #12
Нет, у меня, наверное, терпения не хватит... Пишу, инициализирую заодно:

C++
1
town_square town=new town_square((0.0f,0.0f),(0.0f,0.0f),"");
компайлер выдает: "инициализация: невозможно преобразовать "town_square *" в "town_square""

Где он увидел указатель? ГДЕ?!

Я, блин, не знаю, ну помогите же! Что мне делать?! Что ему нужно, в конце концов?!

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Вообще, сам подход бинарного чтения из файла в память (или в память под объектом) неправильный. Читать нужно в поля структуры(объекта).
Т.е. Вы имеете в виду, что в C++ прочитать в структуру из типизированного файла невозможно? Типо надо считывать сначала в какой-то монолитный бестиповый блок, а потом уже на месте это все разруливать?

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Вообще, сам подход бинарного чтения из файла в память (или в память под объектом) неправильный. Читать нужно в поля структуры(объекта). Если нет конструктора по умолчанию, то создавайте объект с помощью конструктора с параметрами, и читайте в поля объекта.
Ну вот же, вот же он, конструктор:

C++
1
2
town_square(point_town _min, point_town _max, char _file_name[32]) { min.x=_min.x; min.y=_min.y; max.x=_max.x; max.y=_max.y; 
      memset(_file_name,0,sizeof(file_name)*sizeof(file_name[0]));
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:11     fread с непонятной ошибкой #13
Цитата Сообщение от deGeneral Посмотреть сообщение
Где он увидел указатель? ГДЕ?!
C++
1
town_square *town = new town_square((0.0f,0.0f),(0.0f,0.0f),"");
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:12  [ТС]     fread с непонятной ошибкой #14
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
town_square *town = new town_square((0.0f,0.0f),(0.0f,0.0f),"");
Так ведь нет же там звездочки, нет! Объявлена структура, а не указатель на нее.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:17     fread с непонятной ошибкой #15
Цитата Сообщение от deGeneral Посмотреть сообщение
Т.е. Вы имеете в виду, что в C++ прочитать в структуру из типизированного файла невозможно? Типо надо считывать сначала в какой-то монолитный бестиповый блок, а потом уже на месте это все разруливать?
Как раз не нужно считывать в "монолитный бестиповый блок". Нужно читать в именованные поля структуры.

Добавлено через 2 минуты
Цитата Сообщение от deGeneral Посмотреть сообщение
Так ведь нет же там звездочки, нет!
Где нет звёздочки? Вы выделяете память под структуру. Адрес этой памяти помещается в указатель town.
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:20  [ТС]     fread с непонятной ошибкой #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Как раз не нужно считывать в "монолитный бестиповый блок". Нужно читать в именованные поля структуры.
Хорошо. Тогда Ваш фрагмент кода на сей случай (с учетом того, что двое из полей сами по себе являются структурами)? Я бы мог попытаться это реализовать, но боюсь, что опять столкнусь с чем-нибудь аномальным и снова буду занимать Ваше время тупыми вопросами...

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Как раз не нужно считывать в "монолитный бестиповый блок". Нужно читать в именованные поля структуры.

Добавлено через 2 минуты
Где нет звёздочки? Вы выделяете память под структуру. Адрес этой памяти помещается в указатель town.
Простите, но я же по ходу обсуждения отказался от указателя и объявил структуру, а не указатель на нее! Я убрал звездочку.
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:24     fread с непонятной ошибкой #17
Цитата Сообщение от deGeneral Посмотреть сообщение
Я убрал звездочку.
Тогда и new уберите.

Добавлено через 1 минуту
Цитата Сообщение от deGeneral Посмотреть сообщение
Хорошо. Тогда Ваш фрагмент кода на сей случай (с учетом того, что двое из полей сами по себе являются структурами)?
Нужно знать структуру файла.
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:31  [ТС]     fread с непонятной ошибкой #18
Цитата Сообщение от alsav22 Посмотреть сообщение
Тогда и new уберите.
Убрал. Написал так:

C++
1
town_square town=town_square((0.0f,0.0f),(0.0f,0.0f),"");
Похоже, что компилятор эту строку пропустил. Но на fread все равно ругается: "fread: невозможно преобразовать параметр 1 из "town_square" в "void *""

Когда там был указатель, не ругался, но мне посоветовали считывать напрямую в структуру - что теперь?
alsav22
5284 / 4803 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:32     fread с непонятной ошибкой #19
Вот это неправильно написано:
C++
1
point_town(float _x = 0.0f, float _y = 0.0f) { x = _x, y = _y; }
Нужно:
C++
1
point_town(float _x = 0.0f, float _y = 0.0f) { x = _x; y = _y; }
Добавлено через 48 секунд
C++
1
fread(&town,sizeof(town_square),1,t)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 21:32     fread с непонятной ошибкой
Еще ссылки по теме:

C++ Функции fread() и fwrite()
Поиск ошибки в fread C++
Нужен совет fread C++
Fread неправильно считывает файл C++
Параметры функции fread C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:32  [ТС]     fread с непонятной ошибкой #20
Цитата Сообщение от alsav22 Посмотреть сообщение
Нужно знать структуру файла.
Pascal
1
2
3
4
5
6
7
8
9
10
11
  TMyPoint = Record
    x,y : Single
  End;
  TMyPoints = Array Of TMyPoint;
  TTownSquare = Record
    Min,Max  : TMyPoint;
    FileName : String[32]
  End;
 
var
  T  : File Of TTownSquare;
Yandex
Объявления
21.11.2012, 21:32     fread с непонятной ошибкой
Ответ Создать тему
Опции темы

Текущее время: 08:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru