С++ не читает float из файла

OlegXXL

Когда я пытаюсь прочитать определенное число(1A34 203F) в формате float из файла, С++ его не считывает, и устанавливает eof в true. Подскажите, с чем это может быть связанно?
Входной файл:
0000 003F 1A34 203F 0000 003F
В формате float это:
0.5 0.62579501 0.5
Собственно программа:
#include "iostream"
#include "fstream"
using namespace std;

void main
{
float a,b,c;
fstream s("1.bin" , ios_base::in || ios_base::binary);
s.readchar*)&a, sizeof(float;
s.readchar*)&b, sizeof(float;
s.readchar*)&c, sizeof(float;
s.close;
cout<<a<<" "<<b<<" "<<c<<endl;
}

Вывод программы:
0.5 -1.07374e+008 -1.07374e+008

ryshiy28

fstream s("1.bin" , ios_base::in | ios_base::binary);

OlegXXL

fstream s("1.bin" , ios_base::in | ios_base::binary);
не понял...

ryshiy28

Надо заменить || на |

OlegXXL

точно... ступил

Werdna

Никогда не пиши бинарно платформозависимые типы. Это int, long, long long, float, double и прочие.
Всегда нужно писать платформонезависимые. Это на заметку.
Ещё нужно предусмотреть адаптеры для многобайтных типов (например для uint16/32 и пр.) — для таких платформ, где порядок типов другой.
И ещё: вот это идёт нахуй:
 
#include "iostream"
#include "fstream"


НЕ используй плюсовые потоки НИКОГДА, ну кроме мелких тестовых хреней.

yulya

НЕ используй плюсовые потоки НИКОГДА, ну кроме мелких тестовых хреней.
а что вместо них?

Werdna

а что вместо них?
я руками пишу, можешь обертку написать, но стандартные плюсовые потоки написаны ужасно. Они текут, например.

okunek

Они текут, например.
прям таки текут все реализации для всех компиляторов?

pitrik2

Всегда нужно писать платформонезависимые.
для полноты привел бы примеры

Werdna

прям таки текут все реализации для всех компиляторов?
Ну у меня текли, гцц 4. А можно вопрос — нахуя это говно? Тебя возбуждает песать << >> сместо обычных системных вызовов?
Если ты работаешь с бинарным файлами лучше уж работать по-пацански, man 2 read, man 2 write. Сам контролируешь всё как надо.

okunek

Ну касаемо чтения-записи в двоичном формате, то да, стримы отстой.
Но я в данном случае интересовался конкретно потоками, безотносительно того, как их использовать.

Werdna

для полноты привел бы примеры

#include <sys/types.h>

...

u_int8_t
u_int16_t
u_int32_t
u_int64_t


это целые неотрицательные, там типов много.
Для чтения записи я бы рекомендовал делать адаптеры. Но сам не делаю, ленивый.
А про адаптеры есть интересная байка про reiserfs на Альфе. Я не помню ссылку на боян, но могу пересказать, если интерено. Там винт на альфе нормально работал с рейзером, а как воткнули в интел — не читается. А на альйе — всё окей. И наоборот — отформатированный на интеловской платформе не работал на альфе. И всё из-за порядка байт

Maurog

#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 */

okunek

что-то мне подсказывает, что этот файл в posix-е определен
а виндовс, как известно, не совсем posix-совместима

Werdna

Copyright (c) Microsoft Corporation. All rights reserved.
Я не знаю, даже на Солярке сановской такой файл есть. Что там в Микрософте пишут — меня не ебет. Портировать под винду — это всегда было проблемой.
Вроде есть там свои какие-то типы — DWORD, QWORD и пр. Затайпдефь если нужно под мастдай компилить.

Maurog

чуве, ты рассуждаешь над всякими низкоуровневыми чтениями, ендианами и райзерфс, а под самую распространенную ос твоя прога не будет работать.
расставь правильно приоритеты.

ppplva

Просто ситуация такая, что или "самая распространенная ос", или переносимость. Поэтому надо писать правильно, а потом, если возникнет необходимость, портировать на винды каким-нибудь хаком.

Maurog

ситуация чуток другая:
топик-стартер показал, как он использует стримы и делает десериализацию флоутов, ему дали простую подсказку и все у него заработало.
причем я уверен на 99 процентов, что он не избавиться от стримов и от метода считывания флоутов из файла и не будет делать include sys/.., потому что ему конкретно это нах не нужно) у него и так все летает)
и обертывать системные функции чтения я считаю бредом, потому что другие люди уже значительно поебались с этим делом. и если там утечки, то это их баги и они их пофиксят. благо поддержка компиляторов сейчас везде нормальная. нерациональное использование своего времени и изобретание велосипеда.
для решение задачи переносимости я следую от простого к сложному: сначала пишу, чтобы оно работало. потом ковыряю, чтобы оно работало везде.

Ivan8209

> портировать на винды каким-нибудь хаком.
Ссылка.
---
...Я работаю антинаучным аферистом...

Ivan8209

> сначала пишу, чтобы оно работало. потом ковыряю,
> чтобы оно работало везде.
На самом деле, очень плохой способ, поскольку получается смесь
из решений к случаю винды, линукса, БСД и для "остальных"
(читай --- "UNIX").
---
"Мы диалектику учили не по Гегелю.
Бряцанием боёв она врывалась в стих..."
Оставить комментарий
Имя или ник:
Комментарий: