Форум программистов, компьютерный форум CyberForum.ru

Бинарные файлы, чтение и запись - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
Viktory12345
 Аватар для Viktory12345
7 / 7 / 1
Регистрация: 11.12.2009
Сообщений: 41
05.11.2010, 17:54     Бинарные файлы, чтение и запись #1
Доброго времени суток.
Подскажите пожалуйста, как организовать побайтовое чтение и запись данных в бинарный файл.
Правильно ли будет организовано чтение(запись), когда используются
C++
1
2
in.read((char*)&сh,1*sizeof(__int8));
out.write((char*)&сh,1*sizeof(__int8));
Будет ли в этом случае каретка автоматически переходить на следующий символ?
PS программа на С++

Добавлено через 4 часа 4 минуты
Вот код программы, вроде бы получилось записывать и считывать побайтово.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#pragma hdrstop
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <tchar.h>
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
const  int count=16;
int _tmain(int argc, _TCHAR* argv[])
{
__int8 mas[count]={0xBB,0x9,0x0,          
           0xB9,0x3,0x0,                   
           0xB8,0x3C,0x0,           
           0xF7,0xF1,           
           0xD1,0xD8,           
           0xD0,0xDB,           
           0x90};               
 
__int8 ch;
int i;
ofstream out("ex.dat", ios::binary);
for(i=0;i<count;i++)
    {
    ch=mas[i];
    out.write((char*)&ch,sizeof(__int8));
    }
 
out.close();
 
ifstream in("ex.dat", ios::binary);
i=0;
    while(in.good())
    {
        in.read((char*)&ch,sizeof(__int8));
        cout<<hex<<int(ch)<<endl;
        i++;
 
           getch();
    }
 
in.close();
 
return 0;
}
Однако смущают выводимые данные.
ffffffbb
9
0
ffffffb9
3
0
ffffffb8
3c
0
fffffff7
fffffff1
ffffffd1
ffffffd8
ffffffd0
ffffffdb
ffffff90
ffffff90

Т.е. считывается на 1 байт больше, чем было записано. И непонятно откуда вылазит последовательность "FFFFFF".
Прошу помощи у Вас, потому что я уже перепробывала все имеющиеся у меня варианты.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2010, 17:54     Бинарные файлы, чтение и запись
Посмотрите здесь:

C++ Бинарные чтение/запись объектов
fwrite\fread: чтение и запись в бинарные файлы C++
C++ Запись в бинарные файлы
Бинарные запись и чтение структуры в файл C++
Бинарные файлы. Чтение C++
C++ Файлы (чтение/запись)
[Файлы] Запись-чтение-запись. Почему не прокатывает? C++
Запись массивов в бинарные файлы C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KpeHDeJIb
 Аватар для KpeHDeJIb
56 / 56 / 3
Регистрация: 31.10.2010
Сообщений: 103
05.11.2010, 18:51     Бинарные файлы, чтение и запись #2
Ну у меня несколько замечаний по вашему коду, во-первых sizeof(__int8) == 1, во-вторых зачем записывать побайтово, все наоборот стараются как можно больше за раз прочитать/записать, а у вас тут наоборот, возможность -то ведь есть

Опять же проверять после вызова read() неплохо бы вызвать gcount(), который скажет сколько было байт прочитано, и если ничего не прочитано - то, в вашем случае, прерывать цикл чтения.
Viktory12345
 Аватар для Viktory12345
7 / 7 / 1
Регистрация: 11.12.2009
Сообщений: 41
05.11.2010, 20:29  [ТС]     Бинарные файлы, чтение и запись #3
Побайтово считывать/записывать нужно потому что "в университете так сказали"(
за gcount() спасибо большое. Однако последний байт все равно два раза считывается. Организовывала цикл do while.
C++
1
2
3
4
5
6
7
8
    do
    {
        in.read((char*)&ch,sizeof(__int8));
        cout<<hex<<int(ch)<<endl;
        i++;
 
           getch();
    }  while(in.gcount()!=0);
С проблемой вывода лишних букв F разобралась. Происходило это потому, что я использовала знаковые, а не беззнаковые переменные.
Yandex
Объявления
05.11.2010, 20:29     Бинарные файлы, чтение и запись
Ответ Создать тему
Опции темы

Текущее время: 00:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru