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

Работа с двоичными файлами - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
-=- LIsA -=-
 Аватар для -=- LIsA -=-
0 / 0 / 0
Регистрация: 18.09.2012
Сообщений: 25
08.01.2013, 17:08     Работа с двоичными файлами #1
Всем привет.. пытаюсь понять один вопрос.
допустим есть текстовый файл с таким содержанием
12345
67890
я хочу эту информацию переписать в двоичный файл
для этого написала нехитрую программу, но она работает как то странно..
по идее она должна записать данные в двоичном виде, и она просто переписывает значения из текстового файла в таком же, текстовом, виде...
т.е. на выходе файл такой
1234567890
как сделать, чтобы файл был бинарным?
заранее спасибо

вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <string>
 
int main(int argc, char const *argv[])
{
  std::string buffer;
  std::ifstream input("text.txt");
  std::ofstream output("data.bin", std::ios::binary | std::ios::out);
 
  while (input >> buffer) output << buffer;
 
  input.close();
  output.close();
  return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.01.2013, 07:34     Работа с двоичными файлами #2
-=- LIsA -=-, Использовать метод write.
-=- LIsA -=-
 Аватар для -=- LIsA -=-
0 / 0 / 0
Регистрация: 18.09.2012
Сообщений: 25
10.01.2013, 05:50  [ТС]     Работа с двоичными файлами #3
Цитата Сообщение от ForEveR Посмотреть сообщение
-=- LIsA -=-, Использовать метод write.
как понимаю, мне надо как то заменить 10 строчку кода?
C++ (Qt)
1
while (input >> buffer) output << buffer;
это надо заменить?
просто как для строк выделять память, я не знаю...=( длина мб разная у них (у строк)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
10.01.2013, 06:08     Работа с двоичными файлами #4
-=- LIsA -=-, текстовый файл на то и текстовый, там Ваши числа хранятся в виде простых последовательностей символов. В двоичный же файл записываются сырые данные. Все зависит от того, как вы хотите хранить эти данные.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
10.01.2013, 06:20     Работа с двоичными файлами #5
Считали строки, записали строки. Если две строки равны, то их двоичные представления совпадают, логично? Поэтому первый файл и не отличается от второго.
-=- LIsA -=-
 Аватар для -=- LIsA -=-
0 / 0 / 0
Регистрация: 18.09.2012
Сообщений: 25
12.01.2013, 06:26  [ТС]     Работа с двоичными файлами #6
Цитата Сообщение от 0x10 Посмотреть сообщение
Поэтому первый файл и не отличается от второго.
а как сделать, чтобы они отличались?
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
12.01.2013, 08:27     Работа с двоичными файлами #7
Цитата Сообщение от -=- LIsA -=- Посмотреть сообщение
а как сделать, чтобы они отличались?
Записать и прочитать разные данные. Ваш К.О.

Можно читать цифры из текстового файла, преобразовывать их в целочисленный тип (atoi) и записывать в файл. Тогда будет отличаться.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
12.01.2013, 09:52     Работа с двоичными файлами #8
-=- LIsA -=-, по вопросам складывается впечатление, что для Вас двоичный файл - это нечто такое, что нечитабельно при открытии в текстовом редакторе.
-=- LIsA -=-
 Аватар для -=- LIsA -=-
0 / 0 / 0
Регистрация: 18.09.2012
Сообщений: 25
12.01.2013, 18:21  [ТС]     Работа с двоичными файлами #9
Цитата Сообщение от 0x10 Посмотреть сообщение
по вопросам складывается впечатление, что для Вас двоичный файл - это нечто такое, что нечитабельно при открытии в текстовом редакторе.
ну да, я так и думаю...=) например, если открыть какой нибудь архив в блокноте, то будет непонятные символы))
т.е. значит, что мой код верный?=)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <string>
 
int main(int argc, char const *argv[])
{
  std::string buffer;
  std::ifstream input("text.txt");
  std::ofstream output("data.bin", std::ios::binary | std::ios::out);
 
  while (input >> buffer) output << buffer;
 
  input.close();
  output.close();
  return 0;
}
Добавлено через 58 секунд
Цитата Сообщение от WhiteP Посмотреть сообщение
Записать и прочитать разные данные. Ваш К.О.
ахахах)) WhiteP вы Петросян=)
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
12.01.2013, 19:13     Работа с двоичными файлами #10
Кстати, раз уж тут тип std::string используется. Как грамотно записать/считать строки в бинарный файл? Ничего умнее, кроме как
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
#include <iostream>
#include <fstream>
#include <string>
 
int main()
{
    std::string line;
    std::size_t size;
    
    std::ofstream output("data.bin", std::ios::binary | std::ios::out);
    while (std::cin >> line) 
    {   
        size = line.size();
        output.write(reinterpret_cast<char*>(&size), sizeof(std::size_t));
        output.write(line.c_str(), size);
    }
    output.close();
    
    
    std::ifstream input("data.bin", std::ios::binary | std::ios::in);
    char * temp;
    
    while(!input.eof())
    {   
        
        input.read(reinterpret_cast<char*>(&size), sizeof(std::size_t));
        
        if(!input.eof())
        {
        
            temp = new char[size + 1];
            input.read(temp, size);         
            temp[size] = '\0';
            
            line = temp;
            delete [] temp;
            
            std::cout << "size = " << size << "\t string = " << line << "\n";
        }
    }
    input.close();
    
    return 0;
}
в голову не приходит (примерно, особо не тестировал). Или может не стоит так извращаться?
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
12.01.2013, 21:23     Работа с двоичными файлами #11
-=- LIsA -=-, так, вот сейчас надо как-то аккуратно объяснить, чтобы не запутать еще больше... Попробую.

Цитата Сообщение от -=- LIsA -=- Посмотреть сообщение
как сделать, чтобы файл был бинарным?
Информация в компьютере хранится в двоичном виде. Точка. Содержимое файла - это последовательность байт. Как эти байты будут интепретированы - зависит от программы, которая работает с файлом. Так, текстовый редактор каждый байт понимает как код символа - его номер в таблице, и мы видим соответствующий символ на экране. Но от этого текст не перестает быть последовательностью байт.

Далее. В первом же ответе указали, что для чтения/записи сырых данных следует использовать методы read/write. Оператор << используется для форматированного ввода-вывода. Что это означает на практике...
Рассмотрим константу
C++
1
int number = 875770417;
Калькулятор подскажет, что в двоичном виде она выглядит так (младший байт записан первым):
00110001 00110010 00110011 00110100
Десятичные значения каждого байта:
49 50 51 52
Эти коды в таблице ascii соответствуют символам:
1 2 3 4

Следовательно, если я попытаюсь записать в файл значение number, используя метод write, то получу последовательность байт, которая будет отображаться как 1234. Если я воспользуюсь оператором << для форматированного вывода, то мое значение будет преобразовано к строке и в файле мы увидим другой набор символов: 875770417.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <fstream>
#include <vector>
 
int main()
{
    int number = 875770417;
 
    std::ofstream of("out.txt");
 
    of << number << std::endl;
    of.write(reinterpret_cast<char*>(&number), sizeof(number));
 
    of.close();
 
    return 0;
}
Теперь про флаг ios::binary. Вообще он имеет смысл только под виндой. При чтении-записи в текстовом режиме в винде при записи символа перевода строки '\n' по факту пишется два символа: с кодами 0x0D (CR) и 0x0A (LF). При чтении же файла в текстовом режиме последовательность этих двух символов заменяется на '\n'. Открытие файла в бинарном режиме позволяет избежать такой замены. Также если нам нужно перемещаться по файлу, двоичным режим предотвратит потерю дополнительных байт.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2013, 23:06     Работа с двоичными файлами
Еще ссылки по теме:

Работа с двоичными файлами C++
Переделать работу с текстовыми файлами под работу с двоичными файлами C++
C++ Работа с двоичными файлами

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

Или воспользуйтесь поиском по форуму:
Байт
 Аватар для Байт
14006 / 8837 / 1234
Регистрация: 24.12.2010
Сообщений: 16,016
12.01.2013, 23:06     Работа с двоичными файлами #12
Вот на Си это делается так
C
1
2
fscanf(f, "%d", &i);
fwrite(&i, sizeof(int), 1, fbin);
Yandex
Объявления
12.01.2013, 23:06     Работа с двоичными файлами
Ответ Создать тему
Опции темы

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