С++ не читает float из файла
fstream s("1.bin" , ios_base::in | ios_base::binary);
fstream s("1.bin" , ios_base::in | ios_base::binary);не понял...
Надо заменить || на |
точно... ступил
Всегда нужно писать платформонезависимые. Это на заметку.
Ещё нужно предусмотреть адаптеры для многобайтных типов (например для uint16/32 и пр.) — для таких платформ, где порядок типов другой.
И ещё: вот это идёт нахуй:
#include "iostream"
#include "fstream"
НЕ используй плюсовые потоки НИКОГДА, ну кроме мелких тестовых хреней.
НЕ используй плюсовые потоки НИКОГДА, ну кроме мелких тестовых хреней.а что вместо них?
а что вместо них?я руками пишу, можешь обертку написать, но стандартные плюсовые потоки написаны ужасно. Они текут, например.
Они текут, например.прям таки текут все реализации для всех компиляторов?
Всегда нужно писать платформонезависимые.для полноты привел бы примеры
прям таки текут все реализации для всех компиляторов?Ну у меня текли, гцц 4. А можно вопрос — нахуя это говно? Тебя возбуждает песать << >> сместо обычных системных вызовов?
Если ты работаешь с бинарным файлами лучше уж работать по-пацански, man 2 read, man 2 write. Сам контролируешь всё как надо.
Но я в данном случае интересовался конкретно потоками, безотносительно того, как их использовать.
для полноты привел бы примеры
#include <sys/types.h>
...
u_int8_t
u_int16_t
u_int32_t
u_int64_t
это целые неотрицательные, там типов много.
Для чтения записи я бы рекомендовал делать адаптеры. Но сам не делаю, ленивый.
А про адаптеры есть интересная байка про reiserfs на Альфе. Я не помню ссылку на боян, но могу пересказать, если интерено. Там винт на альфе нормально работал с рейзером, а как воткнули в интел — не читается. А на альйе — всё окей. И наоборот — отформатированный на интеловской платформе не работал на альфе. И всё из-за порядка байт
#include <sys/types.h>я очень мало вижу твоих типов (точнее ни одного).
я не тот файл открыл?
/***
*sys/types.h - types returned by system level calls for file and time info
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* This file defines types used in defining values returned by system
* level calls for file status and time information.
* [System V]
*
* [Public]
*
****/
#if _MSC_VER > 1000
#pragma once
#endif
#ifndef _INC_TYPES
#define _INC_TYPES
#if !defined(_WIN32)
#error ERROR: Only Win32 target supported!
#endif
#ifndef _TIME_T_DEFINED
#ifdef _WIN64
typedef __int64 time_t; /* time value */
#else
typedef long time_t; /* time value */
#endif
#if _INTEGRAL_MAX_BITS >= 64
typedef __int64 __time64_t;
#endif
#define _TIME_T_DEFINED /* avoid multiple def's of time_t */
#endif
#ifndef _INO_T_DEFINED
typedef unsigned short _ino_t; /* i-node number (not used on DOS) */
#if !__STDC__
/* Non-ANSI name for compatibility */
typedef unsigned short ino_t;
#endif
#define _INO_T_DEFINED
#endif
#ifndef _DEV_T_DEFINED
typedef unsigned int _dev_t; /* device code */
#if !__STDC__
/* Non-ANSI name for compatibility */
typedef unsigned int dev_t;
#endif
#define _DEV_T_DEFINED
#endif
#ifndef _OFF_T_DEFINED
typedef long _off_t; /* file offset value */
#if !__STDC__
/* Non-ANSI name for compatibility */
typedef long off_t;
#endif
#define _OFF_T_DEFINED
#endif
#endif /* _INC_TYPES */
а виндовс, как известно, не совсем posix-совместима
Copyright (c) Microsoft Corporation. All rights reserved.Я не знаю, даже на Солярке сановской такой файл есть. Что там в Микрософте пишут — меня не ебет. Портировать под винду — это всегда было проблемой.
Вроде есть там свои какие-то типы — DWORD, QWORD и пр. Затайпдефь если нужно под мастдай компилить.
расставь правильно приоритеты.
Просто ситуация такая, что или "самая распространенная ос", или переносимость. Поэтому надо писать правильно, а потом, если возникнет необходимость, портировать на винды каким-нибудь хаком.
топик-стартер показал, как он использует стримы и делает десериализацию флоутов, ему дали простую подсказку и все у него заработало.
причем я уверен на 99 процентов, что он не избавиться от стримов и от метода считывания флоутов из файла и не будет делать include sys/.., потому что ему конкретно это нах не нужно) у него и так все летает)
и обертывать системные функции чтения я считаю бредом, потому что другие люди уже значительно поебались с этим делом. и если там утечки, то это их баги и они их пофиксят. благо поддержка компиляторов сейчас везде нормальная. нерациональное использование своего времени и изобретание велосипеда.
для решение задачи переносимости я следую от простого к сложному: сначала пишу, чтобы оно работало. потом ковыряю, чтобы оно работало везде.
> чтобы оно работало везде.
На самом деле, очень плохой способ, поскольку получается смесь
из решений к случаю винды, линукса, БСД и для "остальных"
(читай --- "UNIX").
---
"Мы диалектику учили не по Гегелю.
Бряцанием боёв она врывалась в стих..."
Оставить комментарий
OlegXXL
Когда я пытаюсь прочитать определенное число(1A34 203F) в формате float из файла, С++ его не считывает, и устанавливает eof в true. Подскажите, с чем это может быть связанно?Входной файл:
0000 003F 1A34 203F 0000 003F
В формате float это:
0.5 0.62579501 0.5
Собственно программа:
Вывод программы:
0.5 -1.07374e+008 -1.07374e+008