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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
-=- LIsA -=-
0 / 0 / 0
Регистрация: 18.09.2012
Сообщений: 25
#1

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

08.01.2013, 17:08. Просмотров 1878. Ответов 11
Метки нет (Все метки)

Всем привет.. пытаюсь понять один вопрос.
допустим есть текстовый файл с таким содержанием
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 17:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с двоичными файлами (C++):

Работа с двоичными файлами - C++
Работа с двоичными файлами: Создать файл и записать в него степени числа 3. Вывести на экран все компоненты файла с четным порядковым...

Работа с двоичными файлами - C++
Всем добрый вечер!) По заданию требуется написать 2 программы (для открытия и чтения двоичного файла) для записи последовательности из n...

Работа с двоичными файлами - C++
У меня есть кусок программы, который мне нужно переписать: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; #include...

Работа с двоичными файлами - C++
Необходимо реализовать функцию чтения и записи небольших файлов в оперативную память (стек программы). Правильно ли я понимаю, что...

Работа с двоичными файлами - C++
Создать файл, состоящий из n вещественных чисел. Вывести на экран все числа данного файла с четными порядковыми номерами, меньшие заданного...

Работа с двоичными файлами - C++
Создать файл,состоящий из n вещественных чисел. Вывести на экран все числа данного файла не попадающие в данный диапазон!!!

11
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
09.01.2013, 07:34 #2
-=- LIsA -=-, Использовать метод write.
1
-=- 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;
это надо заменить?
просто как для строк выделять память, я не знаю...=( длина мб разная у них (у строк)
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
10.01.2013, 06:08 #4
-=- LIsA -=-, текстовый файл на то и текстовый, там Ваши числа хранятся в виде простых последовательностей символов. В двоичный же файл записываются сырые данные. Все зависит от того, как вы хотите хранить эти данные.
1
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
10.01.2013, 06:20 #5
Считали строки, записали строки. Если две строки равны, то их двоичные представления совпадают, логично? Поэтому первый файл и не отличается от второго.
1
-=- LIsA -=-
0 / 0 / 0
Регистрация: 18.09.2012
Сообщений: 25
12.01.2013, 06:26  [ТС] #6
Цитата Сообщение от 0x10 Посмотреть сообщение
Поэтому первый файл и не отличается от второго.
а как сделать, чтобы они отличались?
0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
12.01.2013, 08:27 #7
Цитата Сообщение от -=- LIsA -=- Посмотреть сообщение
а как сделать, чтобы они отличались?
Записать и прочитать разные данные. Ваш К.О.

Можно читать цифры из текстового файла, преобразовывать их в целочисленный тип (atoi) и записывать в файл. Тогда будет отличаться.
1
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
12.01.2013, 09:52 #8
-=- LIsA -=-, по вопросам складывается впечатление, что для Вас двоичный файл - это нечто такое, что нечитабельно при открытии в текстовом редакторе.
1
-=- 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 вы Петросян=)
0
Schizorb
509 / 461 / 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;
}
в голову не приходит (примерно, особо не тестировал). Или может не стоит так извращаться?
1
0x10
2474 / 1647 / 247
Регистрация: 24.11.2012
Сообщений: 4,069
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'. Открытие файла в бинарном режиме позволяет избежать такой замены. Также если нам нужно перемещаться по файлу, двоичным режим предотвратит потерю дополнительных байт.
1
Байт
Эксперт C
16327 / 10603 / 1587
Регистрация: 24.12.2010
Сообщений: 20,199
12.01.2013, 23:06 #12
Вот на Си это делается так
C
1
2
fscanf(f, "%d", &i);
fwrite(&i, sizeof(int), 1, fbin);
1
12.01.2013, 23:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2013, 23:06
Привет! Вот еще темы с ответами:

Работа с двоичными файлами и командной строкой - C++
Помогите, пожалуйста! Не нашла похожей задачи здесь, поэтому создаю новую тему. Нужно готовое решение, сроки горят. Учусь не на...

Организация файлового ввода/вывода (работа с текстовыми и двоичными файлами) - C++
1(работа с текстовыми файлами) -Дан текстовый файл.Переписать в новый файл все его строки, вставив в конец каждый строки колличество...

Работа с двоичными файлами, организация ввода-вывода структурированной информации/ - C++
Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое, выполнить удаление и добавление...

Переделать работу с текстовыми файлами под работу с двоичными файлами - C++
Здравствуйте. В этой программе идёт работа с текстовыми файлами, а нужно с двоичными. Можно ли как-то переделать? #include...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru