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

С++ для начинающих

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

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

21.11.2012, 20:16. Просмотров 1319. Ответов 41
Метки нет (Все метки)

Вот фрагмент кода, который вызывает ошибку:

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;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 20:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос fread с непонятной ошибкой (C++):

Плавятся мозги от непонятной задачи - C++
Кто может, помогите написать программу, которая меняет местами последний (младший) и предпоследний байты переменной i типа int.

fread - C++
Подскажите пожалуйста, как можно записать в структура данные из файла используя fread, просто все записывается в одну кучу и только одна...

Непонятки с fread - C++
Добрый день. Столкнулся с такой проблемой: читаю обычный текстовый файл, однако помимо его содержания мне выдает еще ==**** в конце (причем...

Fread и fout? - C++
Здравствуйте. Была поставлена предо мной задача: Сделать структуру, которая через меню будет выполнять некоторые действия с файлами....

fseek / fread - C++
Всем привет! Такой вопрос возник. Есть строка, состоящая из нескольких &quot;записей&quot; в файле (буквы + числа). Нужно с помощью функций...

Особенности работы fread - C++
Решаю типовую задачу: считывание заголовка bmp-файла (точечного рисунка). Однако у меня ничего не получалось. В ходе расследования...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
21.11.2012, 20:32 #2
C++
1
town_square *town=NULL;
У Вас указатель никуда не указывает при передачи его в fread
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 20:38  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
town_square *town=NULL;
У Вас указатель никуда не указывает при передачи его в fread
Не вопрос. Но если я пишу

C++
1
town_square *town;
без инициализации, то получаю (опять же, в рантайме) "The variable 'town' is being used without being initialized"
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
21.11.2012, 20:46 #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  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
fread должен же куда-то записать данные.
Выделите память под эти данные.
Извините за тупизм, но как? Вот я объявил:

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

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Прочитайте еще раз раздел "указатели" в любом учебнике.
Да читал, но толку? Я имел в виду, что память под сам указатель как таковой, уже выделена. А вот под структуру, на которую он указывает... увы-с.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
21.11.2012, 20:58 #9
Цитата Сообщение от deGeneral Посмотреть сообщение
Я имел в виду, что память под сам указатель как таковой, уже выделена. А вот под структуру, на которую он указывает...
Отсюда и вопрос - куда будет писать fread данные из файла, если для них не выделено памяти?
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:01  [ТС] #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Отсюда и вопрос - куда будет писать fread данные из файла, если для них не выделено памяти?
Я грешным делом считал, что это происходит автоматически при первом же обращении к данной области памяти, ан нет...
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:05 #11
Вообще, сам подход бинарного чтения из файла в память (или в память под объектом) неправильный. Читать нужно в поля структуры(объекта). Если нет конструктора по умолчанию, то создавайте объект с помощью конструктора с параметрами, и читайте в поля объекта.
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:10  [ТС] #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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:11 #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  [ТС] #14
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
town_square *town = new town_square((0.0f,0.0f),(0.0f,0.0f),"");
Так ведь нет же там звездочки, нет! Объявлена структура, а не указатель на нее.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:17 #15
Цитата Сообщение от deGeneral Посмотреть сообщение
Т.е. Вы имеете в виду, что в C++ прочитать в структуру из типизированного файла невозможно? Типо надо считывать сначала в какой-то монолитный бестиповый блок, а потом уже на месте это все разруливать?
Как раз не нужно считывать в "монолитный бестиповый блок". Нужно читать в именованные поля структуры.

Добавлено через 2 минуты
Цитата Сообщение от deGeneral Посмотреть сообщение
Так ведь нет же там звездочки, нет!
Где нет звёздочки? Вы выделяете память под структуру. Адрес этой памяти помещается в указатель town.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 21:17
Привет! Вот еще темы с ответами:

Поиск ошибки в fread - C++
У меня возникла ошибка. Мне нужно прочесть данные с бинарных файлов. Бинарный файл &quot;a.dat&quot; содержит в себе числа '7 0 1 0 1 0 1 0 2 6 2',...

Функции fread() и fwrite() - C++
Меня интересует что это за &quot;счётчик&quot; в этих функциях fwrite( massiv, *size_int * sizeof(unsigned int), 1, fp); &lt;= в большинстве примеров...

Нужен совет fread - C++
Как считать с txt файла значения int с помощью функции fread ( не использовать ifstream и оfstream )

Функция fread и матрицы - C++
Подскажите, как правильно исп. эту ф-ию для считывания информации из файла в матрицу. Есть маленькая программка, которая никак не хочет...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.11.2012, 21:17
Ответ Создать тему
Опции темы

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