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

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

21.11.2012, 20:16. Показов 3689. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2012, 20:16
Ответы с готовыми решениями:

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

Ноутбук имеет склонность к лагам и открытию блокнота с непонятной ошибкой, картинки часто открывает как "черный квадрат"
Имеются несколько проблем: 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; fread($fusers, 1) == 1){ Почему-то он...

41
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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
Сообщений: 50
21.11.2012, 21:37  [ТС]
Цитата Сообщение от 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:44
Цитата Сообщение от deGeneral Посмотреть сообщение
Читал... Долго думал...
О чём? Как компилятор обрабатывет оператор "запятая"?
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 21:44  [ТС]
Последние вести с полей сражений. Вот такой фрагмент кода:

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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 21:45
Цитата Сообщение от deGeneral Посмотреть сообщение
Я в заглавном сообщении привел описание структуры на C++.
И что с этого? Я про структуру файла спросил.
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 21:50  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
О чём? Как компилятор обрабатывет оператор "запятая"?
ага

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
И что с этого? Я про структуру файла спросил.
ну вот эти структуры, которые town_square, в файле и есть. Два структурных поля по два флоата плюс строка.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 22:00
Цитата Сообщение от deGeneral Посмотреть сообщение
Два структурных поля по два флоата плюс строка
Ну и читайте их в поля стуктуры. В файле они через пробел расположены или как?
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 22:03  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Ну и читайте их в поля стуктуры. В файле они через пробел расположены или как?
Да нет, это же бинарный файл. Подряд, разделителя никакого нет.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 22:08
Файл бинарный, а открываете его в режиме простого чтения.
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 22:16  [ТС]
А как его еще открывать? Мне читать записи, то бишь, структуры, из него надо, а не писать...
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
21.11.2012, 22:18
ну так открывайте его как двоичный, а не как текстовый.
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 22:20  [ТС]
C++
1
FILE *t = fopen("squares.db","r");
Это я его как текстовый открыл? А как надо?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
21.11.2012, 22:22
Файлы C++
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 22:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    FILE *t = fopen("squares.db", "rb");                            
    
    town_square town = town_square((0.0f, 0.0f),(0.0f, 0.0f),"");                                    
    vector<TOWN_SQUARE> squares;                           
    while (!feof(t))
    {
        fread(&town.min.x, sizeof(float), 1, t);
        fread(&town.min.y, sizeof(float), 1, t);
        fread(&town.max.x, sizeof(float), 1, t);
        fread(&town.max.y, sizeof(float), 1, t);
        fread(&town.file_name, sizeof(char), 32, t);
        squares.push_back(town);
    }                               
    
    fclose(t);
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 22:38  [ТС]
Большое спасибо, буду пробовать!

Добавлено через 3 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
    town_square town = town_square((0.0f, 0.0f),(0.0f, 0.0f),"");
Я это... инициализацию строки убрал, т.к. там из-за memset возникало очень мутное исключение...
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 23:04
C++
1
2
3
4
5
6
7
8
9
10
11
typedef struct town_square
{
    point_town min; 
    point_town 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; 
        strcpy(file_name, _file_name);
    }
Добавлено через 3 минуты

C++
1
 town_square town(point_town(0.0f, 0.0f), point_town(0.0f, 0.0f), "");
И чтение так сделайте:
C++
1
2
3
4
5
6
7
8
9
10
 while (true)
    {
        fread(&town.min.x, sizeof(float), 1, t);
        fread(&town.min.y, sizeof(float), 1, t);
        fread(&town.max.x, sizeof(float), 1, t);
        fread(&town.max.y, sizeof(float), 1, t);
        fread(&town.file_name, sizeof(char), 32, t);
        if (feof(t)) break;
        squares.push_back(town);
   }
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
21.11.2012, 23:07  [ТС]
alsav22, спасибо, у меня уже заработало, но я обязательно переделаю, как Вы советуете.
Данные считываются из файла правильно, проверял, единственное что - строки необтримленные. Есть ли в C++ какая-нибудь функция типа trim, убирающая из строки пробелы и прочие непотребные символы?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.11.2012, 23:41
Это вот так можно (в point_town конструктор по умолчанию есть):
C++
1
town_square town(point_town(), point_town(), "");
Добавлено через 52 секунды
Если чтение не переделать, то в векторе лишняя структура будет.

Добавлено через 58 секунд
Цитата Сообщение от deGeneral Посмотреть сообщение
Есть ли в C++ какая-нибудь функция типа trim, убирающая из строки пробелы и прочие непотребные символы?
Для чего убирать?
1
 Аватар для deGeneral
5 / 5 / 1
Регистрация: 20.11.2012
Сообщений: 50
22.11.2012, 02:28  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Это вот так можно (в point_town конструктор по умолчанию есть):
C++
1
town_square town(point_town(), point_town(), "");
Добавлено через 52 секунды
Если чтение не переделать, то в векторе лишняя структура будет.

Добавлено через 58 секунд
Для чего убирать?
Для дальнейшего адекватного и безглючного сравнения.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.11.2012, 12:13
Цитата Сообщение от deGeneral Посмотреть сообщение
Для дальнейшего адекватного и безглючного сравнения.
Для этого нужно знать, какую информацию несёт строка. Если мусор в конце строки (т.е., в данном коде, её размер меньше 32 байтов), то от него можно избавляться при чтении (уже после чтения из файла) определёнными функциями до символа окончания строки (если он конечно присутствует в строке, а для этого нужно знать: каким методом строки создавались и записывалась в файл). Насчёт пробелов не совсем понятно, как они мешают адекватному и безглючному сравнению. Но, повторяю, чтобы с этим определиться, нужно знать, какую информацию несёт строка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2012, 12:13

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru