Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
1

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

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

Author24 — интернет-сервис помощи студентам
Вот фрагмент кода, который вызывает ошибку:

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;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2012, 20:16
Ответы с готовыми решениями:

Приложение вылетает с непонятной ошибкой
package x.com.geoquiz; import android.support.v7.app.AppCompatActivity; import android.os.Bundle;...

Ноутбук имеет склонность к лагам и открытию блокнота с непонятной ошибкой, картинки часто открывает как "черный квадрат"
Имеются несколько проблем: 1) Ноутбук иногда долго думает, будто запущенно ЧТО-ТО ещё. 2)...

Ошибка Warning: fread() [function.fread]: Length parameter must be greater than 0
Есть строка кода if(!preg_match('/'.$user.&quot;/&quot;,fread($fusers,filesize(&quot;user/users.txt&quot;))) &amp;&amp;...

Решение непонятной задачи
Помогите плиззззз 1)Нужно написать программу, которая считывает текст из файла и выводит в другой...

41
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
21.11.2012, 20:32 2
C++
1
town_square *town=NULL;
У Вас указатель никуда не указывает при передачи его в fread
1
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
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"
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
21.11.2012, 20:46 4
Цитата Сообщение от deGeneral Посмотреть сообщение
без инициализации, то получаю (опять же, в рантайме) "The variable 'town' is being used without being initialized"
fread должен же куда-то записать данные.
Выделите память под эти данные.
1
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 20:50  [ТС] 5
Цитата Сообщение от Croessmah Посмотреть сообщение
fread должен же куда-то записать данные.
Выделите память под эти данные.
Извините за тупизм, но как? Вот я объявил:

C++
1
town_square *town;
Это указатель, т.е. байт эдак около 8-ми, надо понимать, уже выделено? Хорошо. Теперь сама структура, на которую указывает данный указатель: конструктор вызвать? Или что-то еще сделать?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 20:51 6
Зачем вам здесь указатель? Объявите структуру и читайте туда.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
21.11.2012, 20:52 7
Цитата Сообщение от deGeneral Посмотреть сообщение
Это указатель, т.е. байт эдак около 8-ми, надо понимать, уже выделено?
Прочитайте еще раз раздел "указатели" в любом учебнике.
1
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 20:57  [ТС] 8
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем вам здесь указатель? Объявите структуру и читайте туда.
Не могу! Тогда компилятор не пропускает: "town_square: нет подходящего конструктора по умолчанию"
Ну что за язык? Как ни напиши, отовсюду палки в колеса...

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

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

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

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

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

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

Когда там был указатель, не ругался, но мне посоветовали считывать напрямую в структуру - что теперь?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:32 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)
1
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 21:32  [ТС] 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;
0
21.11.2012, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2012, 21:32
Помогаю со студенческими работами здесь

Исключение по непонятной причине
Программа делает скриншот.. в течении нескольких минут всё работает, но потом вылетает исключение...

BSOD по непонятной причине
Начал проявляться - сегодня, первый раз - во время игры в Crusader Kings 2, потом - постоянно. ...

По непонятной причине виснет программа
Пишу небольшой GUI для HLDS Update Tool. Но при запуске программы она зависает, неизвестно где, и...

Значение непонятной части программы
Вот программка, вот 8-ая строка: for (int i=2; i &lt;= x/i; i++) и для чего нужен элемент: i &lt;= x/i ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru