Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

21.11.2012, 20:16. Просмотров 1363. Ответов 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;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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-файла (точечного рисунка). Однако у меня ничего не получалось. В ходе расследования...

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от deGeneral Посмотреть сообщение
Хорошо. Тогда Ваш фрагмент кода на сей случай (с учетом того, что двое из полей сами по себе являются структурами)?
Нужно знать структуру файла.
1
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
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
alsav22
5428 / 4823 / 442
Регистрация: 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
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
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
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:35 #21
Цитата Сообщение от deGeneral Посмотреть сообщение
Когда там был указатель, не ругался, но мне посоветовали считывать напрямую в структуру - что теперь?
После этого я и другое советовал, не заметили?

Добавлено через 1 минуту
Цитата Сообщение от deGeneral Посмотреть сообщение
Нужно знать структуру файла.
Код Pascal1
TMyPoint = Record
* * x,y : Single
* End;
* TMyPoints = Array Of TMyPoint;
* TTownSquare = Record
* * Min,Max *: TMyPoint;
* * FileName : String[32]
* End;
var
* T *: File Of TTownSquare;
Тут форум по С++.
1
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:37  [ТС] #22
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это неправильно написано:
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; }
Читал... Долго думал...

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
После этого я и другое советовал, не заметили?

Добавлено через 1 минуту
Тут форум по С++.
Я в заглавном сообщении привел описание структуры на C++.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:44 #23
Цитата Сообщение от deGeneral Посмотреть сообщение
Читал... Долго думал...
О чём? Как компилятор обрабатывет оператор "запятая"?
1
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:44  [ТС] #24
Последние вести с полей сражений. Вот такой фрагмент кода:

C++
1
2
3
4
5
6
    town_square town=town_square((0.0f,0.0f),(0.0f,0.0f),"");     
    vector<TOWN_SQUARE> squares;                                  
    while (fread(&town,sizeof(town_square),1,t)==1) {
        squares.push_back(town);                           
    }
    fclose(t);
выдает в рантайме исключение "Память не может быть written".
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:45 #25
Цитата Сообщение от deGeneral Посмотреть сообщение
Я в заглавном сообщении привел описание структуры на C++.
И что с этого? Я про структуру файла спросил.
1
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 21:50  [ТС] #26
Цитата Сообщение от alsav22 Посмотреть сообщение
О чём? Как компилятор обрабатывет оператор "запятая"?
ага

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
И что с этого? Я про структуру файла спросил.
ну вот эти структуры, которые town_square, в файле и есть. Два структурных поля по два флоата плюс строка.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 22:00 #27
Цитата Сообщение от deGeneral Посмотреть сообщение
Два структурных поля по два флоата плюс строка
Ну и читайте их в поля стуктуры. В файле они через пробел расположены или как?
1
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 22:03  [ТС] #28
Цитата Сообщение от alsav22 Посмотреть сообщение
Ну и читайте их в поля стуктуры. В файле они через пробел расположены или как?
Да нет, это же бинарный файл. Подряд, разделителя никакого нет.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 22:08 #29
Файл бинарный, а открываете его в режиме простого чтения.
1
deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 47
21.11.2012, 22:16  [ТС] #30
А как его еще открывать? Мне читать записи, то бишь, структуры, из него надо, а не писать...
0
21.11.2012, 22:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 22:16
Привет! Вот еще темы с ответами:

Поиск ошибки в 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++
Подскажите, как правильно исп. эту ф-ию для считывания информации из файла в матрицу. Есть маленькая программка, которая никак не хочет...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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