You are not logged in.
Pages: 1
Замутил прогу, нужно сохранить несколько чисел в двоичный файл. Уже чётко написал, какие данные будут по сколько байт, теперь мне нужно сохранять их в двоичном виде и считывать. Как реализовать на Си++?
З.Ы. WORD - 2 unsigned байта (0-255), BYTE - 1 unsigned байт (0-127)?
З.З.Ы. Желательно VCL-ским классом TFileStream.
Last edited by ~AquaZ~ (13-06-2010 23:00)
Offline
Использование TFileStream для подобной задачи - чистый оверкилл.
// запись
WORD w = 0x1234;
BYTE b = 0x56;
FILE * f = fopen ("file.bin", "wb");
if (f) { // если файл открылся
fwrite (&w, sizeof (WORD), 1, f);
fwrite (&w, sizeof (BYTE), 1, f);
fclose (f);
}
// чтение
WORD w;
BYTE b;
FILE * f = fopen ("file.bin", "rb");
if (f) {
fread (&w, sizeof (WORD), 1, f);
fread (&b, sizeof (BYTE), 1, f);
fclose (f);
}По-хорошему, нужно проверять результат fread/write - они возвращают количество прочитанных записанных байтов.
PS. WORD => 0..65535, BYTE => 0..255
Offline
Спасибо!!!! 
А какой нужен заголовочный файл? 
З.Ы. Мой З.Ы. из первого поста был чисто бредом

Last edited by ~AquaZ~ (14-06-2010 05:39)
Offline
Хм. Если C++, то лучше подключать cstdio.
А вообще, в C++ принято пользоваться стримами.
#include <fstream>
int main()
{
unsigned char b = 0x12;
unsigned short w = 0x3456;
// запись
std::ofstream out;
out.open("file.bin", std::ios::binary | std::ios::out);
if (out.is_open())
{
out.write(reinterpret_cast<const char *>(&b), sizeof(b));
out.write(reinterpret_cast<const char *>(&w), sizeof(w));
out.close();
}
// чтение
std::ifstream in;
in.open("file.bin", std::ios::binary | std::ios::in);
if (in.is_open())
{
in.read(reinterpret_cast<char *>(&b), sizeof(b));
in.read(reinterpret_cast<char *>(&w), sizeof(w));
in.close();
}
return 0;
}Плохо только, что при бинарном вводе-выводе приходится приводить типы.
Last edited by Alien (15-06-2010 07:27)
Offline
Не, у listener'a код компактнее 
Offline
while (fread(&c, sizeof(char), 1, f))
{
ShowMessage(c);
}
fclose (f);Файл открывается, но вылазят каракули (по 1 штуке). Как прочитать в CHAR по букве?
Offline
Да, единственное полезное - try-catch. Хотя и то головняк, можно было бы вместо throw возвращать объект класса Error или что-то вроде того.
[large]Вопрос всё ещё открыт.[/large]
Last edited by ~AquaZ~ (25-09-2010 21:18)
Offline
@~AquaZ~ - Сформулируй четко, что тебе нужно.
Такого не хватит?
while ( (int c = fgetc (f) != EOF) putc (c, stdout);
А что касается try/catch... Возвращать объект Error откуда и куда?
Типичный пример (не забываем, что при обработке throw нужно вызвать дестукторы obj1_1, obj1_2, obj2 и obj3).
void a (Object1& obj1, Object2& obj2) {
Object3 obj3;
throw SomeError();
}
void b (Object1& obj1) {
Object2 obj2;
a (obj1, obj2)
}
void c () {
Object1 obj1_1;
Object1 obj1_2;
b (obj1);
b (obj2);
}
void d () {
try {
c ();
} catch (SomeError e) {
// do something
}
}
Offline
Сформулируй четко, что тебе нужно.
В цикле прочитать файл по одному знаку.
Offline
void d () { try { d (); } catch (SomeError e) { // do something } }
Через пару секунд рекурсивных вызовов возникнет ошибка stack-overflow, а не SomeError.:D
~AquaZ~, в unicode попробуй считать. И убедись, что открываешь файл в текстовом режиме. В некоторых кодировках в начало файла добавляется идентификатор этой кодировки. Например, файл в кодировке UTF-8 будет всегда начинаться с байтов EF BB BF. Вот тебе и каракули.=)
Offline
@~AquaZ~ - Если файл обычный текстовый, то приведенной строчки должно хватить.
(она читает файл посимвольно и выводит на экран)
Для юникодных, в MSVC можно указать fopen_s флаги автотрансляции кодировки.
@Alien - угу. опечатался. c(), конечно.
Offline
while (char с = fgetc(f) != EOF)
{
ShowMessage(c);
}[BCC32 Error] Unit1.cpp(36): E2451 Undefined symbol 'c'
Offline
В цикле прочитать файл по одному знаку.
#include <iostream>
#include <fstream>
using namespace std;
int main (int argc, char *argv[])
{
char ch;
if (argc != 2)
{
cout << "Usage: <filename>\n";
return 1;
}
ifstream in(argv[1], ios::in | ios::binary);
if (!in)
{
cout << "Cannot open file.\n";
return 1;
}
while (in.get(ch))
cout << ch;
in.close();
return 0;
}
Offline
Как-то по-древнему смотрится...
Offline
Классический C++. В том виде, в каком он был в середине 80-х. Код listener'а еще древнее - прямиком из 70-х.:lol:
Offline
Хы, опять я. А как побитово прочитать файл?
Offline
ЫЫЫ, есть тут кто? Кто-нибудь знает, как прочитать файл побитово?
Offline
ты чего пургу несешь? Даже в аппаратной части фигурируют многобитные шины данных и всякое такое. Машина за раз читает байт/слово/двойное слово и т.д. Что уж говорить о программной части, в которой биты обрабатываются только как части битфилдов.
А вообще, большие объемы данных рекомендуется считывать с диска частями размером в сегмент файловой системы. Для NTFS - 4 КБ, для CDFS - 2 КБ...
Offline
Pages: 1