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

Запись в бинарный файл - C++

Восстановить пароль Регистрация
 
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
23.10.2013, 13:35     Запись в бинарный файл #1
Всем привет.
Подскажите пожалста как через fstream добавить запись в бинарный файл ? нужно добавить именно В НАЧАЛО , не очищая содержимое файла.

У меня получается только в конец файла. А в начало как? а то намучался уже...
(с бинарным файлом работаю)


C++
1
2
3
4
5
           fstream bfile;
 
    bfile.open("base.bin", ios::beg);   // Я ЖЕ ТУТ КУРСОР В НАЧАЛО ФАЙЛА СТАВЛЮ! или нет?  
    bfile.write((char * ) "Что нибудь", sizeof(int));   
    bfile.close();
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 13:35     Запись в бинарный файл
Посмотрите здесь:

C++ Запись в бинарный файл
C++ Запись в бинарный файл
C++ запись в бинарный файл
C++ запись в бинарный файл
Запись в бинарный файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
23.10.2013, 15:16     Запись в бинарный файл #2
C++
1
bfile.open ("base.bin", std::fstream::in | std::fstream::out | std::fstream::beg);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2013, 15:43     Запись в бинарный файл #3
При открытии без дополнительных параметров(курсор в конце, дозапись) и так в начале будет.

Добавлено через 2 минуты
Только открывайте в бинарном режиме:
C++
1
fstream bfile("base.bin", ios::in | ios::out | ios::binary);
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
24.10.2013, 12:59  [ТС]     Запись в бинарный файл #4
СПАСИБО, получилось
Работает так
C++
1
bfile.open ("base.bin", std::fstream::in | std::fstream::out | std::fstream::beg);
и так
C++
1
bfile.open("base.bin", ios::in | ios::out | ios::binary);
Только объясните пожалста разницу между двумя этими строками ...
во второй строке я указываю, что файл бинарный (ios::binary), но первая строка ведь тоже работает...

Добавлено через 3 часа 53 минуты
Оказывается сейчас переписывается начало файла, а мне нужно смещать содержимое, т.е. информация должна подвинуться, а не затираться новой.
Как реализовать , подскажите пожалста?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:05     Запись в бинарный файл #5
Цитата Сообщение от albannikov Посмотреть сообщение
но первая строка ведь тоже работает...
И что с того? Пишите\читаете в бинарном режиме - в таком режим и файл открывайте.
Цитата Сообщение от albannikov Посмотреть сообщение
Только объясните пожалста разницу между двумя этими строками ...
Разница между открытием в текстовом режиме и в бинарном.

Добавлено через 3 минуты
Цитата Сообщение от albannikov Посмотреть сообщение
Оказывается сейчас переписывается начало файла, а мне нужно смещать содержимое, т.е. информация должна подвинуться, а не затираться новой.
Как реализовать , подскажите пожалста?
Перезаписывать весь файл.
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
24.10.2013, 13:49  [ТС]     Запись в бинарный файл #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Перезаписывать весь файл.
Забирать содержимое файла в структуру например , писать новую инфу, затем выгружать из структуры остальные данные?
Должен же быть вариант дозаписи со смещением содержимого.. неужто в великом и могучем С++ такого не реализовано?
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
24.10.2013, 13:59     Запись в бинарный файл #7
Цитата Сообщение от albannikov Посмотреть сообщение
неужто в великом и могучем С++ такого не реализовано?
такого вообще в файловой системе не реализовано) - нельзя физически сдвинуть файл(так чтобы спереди осталось место) - для большего размера необходимо большее место, с учетом фрагментации это невозможно, надо заново переписывать файл
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 13:59     Запись в бинарный файл #8
Цитата Сообщение от albannikov Посмотреть сообщение
неужто в великом и могучем С++ такого не реализовано?
А вы тогда чем будете заниматься?
Есть способы более простые и более сложные. Один из простых вы описали. Более сложные - это перезапись блоками, со смещением, начиная с конца файла.
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
24.10.2013, 14:29  [ТС]     Запись в бинарный файл #9
СПАСИБО, видимо так и придётся делать.
Сейчас другой вопрос возник, шобы тему не создавать спрошу тут...

Что то с кодировкой видимо не так ... когда в файл записываю данные, пишутся вместо Русских символов иероглифы (англ. и цифры без проблем пишет).. где поискать проблему можно?

ЗЫ.: когда из текстовика в бинарный передаю с Русским проблем нету... только при вводе данных с консоли такая беда

Вот код на всякий случай:
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
void AddBin()                                                   // Запись в BIN новой строки
{   
    system("CLS");
    setlocale( LC_ALL,"Russian" );  // Русские символы
    fstream bfile;
    SNew New;
    bfile.open("base.bin", ios::in | ios::out | ios::beg);  
    unsigned int kol = KOL;
 
    cout << "Тип? :         ";
    cin >> New.tip;
 
    cout << "Фирма? :       ";
    cin >> New.firma;
 
    cout << "Модель? :      ";
    cin >> New.model;
 
    cout << "Год? :         ";
    cin >> New.god;
 
    cout << "Серийный номер? :  ";
    cin >> New.serial;
 
    cout << "Инвентарный номер? :   ";
    cin >> New.inventar;
 
    cout << "Состояние (норм)? :    ";
    cin >> New.sost;
    
    cout << "Рейтинг? :     ";
    cin >> New.sred;
 
    SetColor(14,0);
    cout << endl << "Сейчас запишем :-)" << endl;   
 
    bfile.write ((char *) &kol, sizeof(unsigned int));      
    bfile.write ((char * ) &New, sizeof(SNew));     
    
    bfile.close();  
    dialog();   
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 14:39     Запись в бинарный файл #10
Цитата Сообщение от albannikov Посмотреть сообщение
setlocale( LC_ALL,"Russian" ); // Русские символы
Только на вывод. Для ввода и вывода по русски:
C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
В свойствах консоли выбрать шрифт: Lucida Console
albannikov
 Аватар для albannikov
12 / 12 / 2
Регистрация: 20.12.2012
Сообщений: 75
24.10.2013, 14:45  [ТС]     Запись в бинарный файл #11
и в очередной раз СПАСИБО, помогло
А можно указать в коде , шобы программа както сама выбирала и устанавливала шрифт Lucida Console? ... а то на каждом компе не будут же в настройки консоли лезть..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 14:52     Запись в бинарный файл
Еще ссылки по теме:

C++ Запись string в бинарный файл
C++ Запись текста в бинарный файл
C++ Запись в бинарный файл

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 14:52     Запись в бинарный файл #12
Цитата Сообщение от albannikov Посмотреть сообщение
А можно указать в коде , шобы программа както сама выбирала и устанавливала шрифт Lucida Console?
Нет.

Добавлено через 24 секунды
Цитата Сообщение от albannikov Посмотреть сообщение
а то на каждом компе не будут же в настройки консоли лезть..
Больная тема...

Добавлено через 3 минуты
Есть ещё способ CharToOem(), OemToChar, но я им не пользуюсь, поэтому ничего об этом не могу сказать. Поищите в инете информацию.
Yandex
Объявления
24.10.2013, 14:52     Запись в бинарный файл
Ответ Создать тему
Опции темы

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