1 / 1 / 1
Регистрация: 17.10.2014
Сообщений: 153
1

Запись в файл побитово потоком

08.11.2014, 11:04. Показов 1884. Ответов 14
Метки нет (Все метки)

Как с помощью cout записывать побитово? Я думал, что это делается с помощью - ios :: binary . Но оказалось, что нет... Файл который был создан программой открываю текстовым редактором и вижу обычные цифры, т.е. записывает программа посимвольно.. Так как же записывать побитово? Т.е. чтобы при открытии файл мне выдавал "мусор"

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
#include <iostream>
#include <locale>
#include <fstream>
#include <time.h>
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"rus");
 
    int N=0;
 
    //бинарное считывание и перезапись файла, который нах-ся в другом проекте
    ofstream ofs1("C:\\Users\\1\\Documents\\Visual Studio 2010\\Projects\\proba_fail\\proba_fail\\text1.dat", ios::binary|ios::out);
    ofstream ofs2("C:\\Users\\1\\Documents\\Visual Studio 2010\\Projects\\proba_fail\\proba_fail\\text2.dat", ios::binary|ios::out);
    ofstream ofs3("C:\\Users\\1\\Documents\\Visual Studio 2010\\Projects\\proba_fail\\proba_fail\\text3.dat", ios::binary|ios::out);
 
    cout << "Из скольких чисел будут состоять файлы? Из ";
    cin >> N;
 
    srand(time(NULL));
 
    for(int i=0; i<N; i++)
    {
        if(i<N-1) //заполняем файлы случайнми числами от -16000 до 16000
        {
            ofs1 << rand() %32000 - 16000 << endl;
            ofs2 << rand() %32000 - 16000 << endl;
            ofs3 << rand() %32000 - 16000 << endl;
        }
        else if(i==N-1) //в конце файла переход на новую строку не делаем
        {
            ofs1 << rand() %32000 - 16000;
            ofs2 << rand() %32000 - 16000;
            ofs3 << rand() %32000 - 16000;
        }
    }
 
    ofs1.close();
    ofs2.close();
    ofs3.close();
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2014, 11:04
Ответы с готовыми решениями:

Побитово зашифровать и сохранить файл
Всем привет! Такая проблема: Есть набор битов, нужно создать новый файл, который будет в виде этих...

Связать файл с потоком, не уничтожая его
Подскажите пожалуйста: как связать файл с потоком не уничтожая его. Делаю так: ofstream nm;...

Как открыть второй файл тем же потоком?
Создаю поток ifstream ifs и открываю файл A.txt, закрываю поток ifs.close(). Попытка открыть второй...

Можно потоком читать файл, если он может с любым переводом строки?
На одной и той же машине перевод строки может быть виндузячим, никсоидным, или маковым. Можно...

14
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
08.11.2014, 11:12 2
А где здесь биты?
В бинарном режиме запись через ofs1.write().
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.11.2014, 11:30 3
Неужели не очевидно, что повторяющиеся строки должны быть как минимум оформлены в цикл?
Цитата Сообщение от BabaSveta Посмотреть сообщение
Так как же записывать побитово? Т.е. чтобы при открытии файл мне выдавал "мусор"
operator<< осуществляет форматированный, считай, текстовый вывод. Для записи в std::ostream в бинарном режиме, как уже советовал nmcf, следует использовать функцию-член write().
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.11.2014, 13:53 4
Цитата Сообщение от BabaSveta Посмотреть сообщение
записывать побитово
в стандартной библиотеке ввода/вывода нет такой возможности. побайтно - пожалуйста
0
1 / 1 / 1
Регистрация: 17.10.2014
Сообщений: 153
08.11.2014, 14:05  [ТС] 5
не совсем понять куда вставить этот write().. Куда не вставлял ругается, даже если убираю "<<" и "endl"
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.11.2014, 14:14 6
Лучший ответ Сообщение было отмечено BabaSveta как решение

Решение

Цитата Сообщение от BabaSveta Посмотреть сообщение
не совсем понять куда вставить этот write()

Не по теме:

С русским беда?


Вместо
C++
1
  ofs1 << rand() %32000 - 16000 << endl;
пишем
C++
1
2
int r = rand();
ofs1.write( reinterpret_cast<const char*>(&r), sizeof(r) );
0
1 / 1 / 1
Регистрация: 17.10.2014
Сообщений: 153
08.11.2014, 14:39  [ТС] 7
за что отвечает reinterpret_cast<const char* ?
а теперь, чтобы считать этот файл с другой программы нужно воспользоваться ofs1.read?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.11.2014, 14:45 8
Цитата Сообщение от BabaSveta Посмотреть сообщение
за что отвечает reinterpret_cast<const char* ?
За преобразование адреса целого числа в адрес на символ (байт) в данном случае.
Цитата Сообщение от BabaSveta Посмотреть сообщение
чтобы считать этот файл с другой программы нужно воспользоваться ofs1.read?
да.
0
1 / 1 / 1
Регистрация: 17.10.2014
Сообщений: 153
08.11.2014, 22:03  [ТС] 9
а как организовать считывание файла без последнего элемента? Просто записывая в файл элементы программа переводит на новую строку, а при чтении 2 элемента повторно изображаются... Хотелось бы либо убрать в конце переход на новую строку, либо же организовать считывание файла без последнего элемента. Заранее спасибо)

Запись случаных чисел в 3 файла.
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
#include <iostream>
#include <locale>
#include <fstream>
#include <time.h>
 
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"rus");
 
    int N=0;
 
    //бинарное считывание и перезапись файла, который нах-ся в другом проекте
    ofstream ofs1("C:\\Users\\1\\Documents\\Visual Studio 2010\\Projects\\proba_fail\\proba_fail\\text1.dat", ios::binary|ios::out);
    ofstream ofs2("C:\\Users\\1\\Documents\\Visual Studio 2010\\Projects\\proba_fail\\proba_fail\\text2.dat", ios::binary|ios::out);
    ofstream ofs3("C:\\Users\\1\\Documents\\Visual Studio 2010\\Projects\\proba_fail\\proba_fail\\text3.dat", ios::binary|ios::out);
 
    cout << "Из скольких чисел будут состоять файлы? Из ";
    cin >> N;
 
    srand(time(NULL));
 
    for(int i=0; i<N; i++)
    {
        if(i<N) //заполняем файлы случайнми числами от -16000 до 16000
        {
            int r1 = rand() %32000 - 16000;
                ofs1.write( reinterpret_cast<const char*>(&r1), sizeof(r1) );
            int r2 = rand() %32000 - 16000;
                ofs2.write( reinterpret_cast<const char*>(&r2), sizeof(r2) );
            int r3 = rand() %32000 - 16000;
                ofs3.write( reinterpret_cast<const char*>(&r3), sizeof(r3) );
        }
    }
 
    ofs1.close();
    ofs2.close();
    ofs3.close();
 
    return 0;
}
Считывание побайтовое чисел с файла
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
48
49
50
#include <iostream>
#include <fstream>
#include <iomanip>
#include <io.h>
#include <conio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"rus");
 
    int first,      //числа с 1-го файла
        second,     //числа со 2-го файла
        third;      //числа с 3-го файла
 
    //access возвращает 0, если доступ разрешен и -1 если файла не существует, либо нету прав на доступ
    //00 - права на чтение, 04 - права на запись
 
    if((access("text1.dat", 00))==-1 || (access("text2.dat", 00))==-1 || (access("text3.dat", 00))==-1){
        cout << "Есть недостающие файлы. Программа прекращена" << endl;
        getch();
        return -1;
    }
 
    //написать дополнительную программу для создания файла в dat расширении через VisStudio с возможностью добавлять в неё случайные числа и свои числа
    ifstream fout1("text1.dat", ios_base::binary); //считывание чисел с 1-го файла
    ifstream fout2("text2.dat", ios_base::binary); //2-го
    ifstream fout3("text3.dat", ios_base::binary); //3-го
 
    while(fout3.eof()==0 && fout2.eof()==0 && fout1.eof()==0)   //конец файла - истина. Будем делать пока 3 файла выдают ложь
    {
        fout1.read((char*)&first, sizeof(first));
        fout2.read((char*)&second,sizeof(second));
        fout3.read((char*)&third, sizeof(third));
 
        cout << setw(10) << left << char(124);   
        cout << setw(20) << left << first;
        cout << setw(20) << left << second;
        cout << setw(10) << left << third;  
        cout << char(124) << endl;
    }
 
    fout1.close();
    fout2.close();
    fout3.close();
 
    system("pause");
    return 0;
}
Вот он повторяет 2 элемента..

не могу прикрепить фотку с радикала.. Как поступить?))
Как исправить программу?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.11.2014, 22:49 10
Цитата Сообщение от BabaSveta Посмотреть сообщение
не могу прикрепить фотку с радикала.. Как поступить?))
В расширенном режиме ответа можно и сюда картинку прикрепить.
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
08.11.2014, 23:18 11
BabaSveta, бабуль, перед тем как задать вопрос, постарайся сначала сама подумать над этим вопросом и уже потом сформулировать свой.
Старайся быть умнее чем другие!

Добавлено через 17 секунд
BabaSveta, бабуль, перед тем как задать вопрос, постарайся сначала сама подумать над этим вопросом и уже потом сформулировать свой.
Старайся быть умнее чем другие!
0
1 / 1 / 1
Регистрация: 17.10.2014
Сообщений: 153
09.11.2014, 07:55  [ТС] 12
вот фото
https://www.cyberforum.ru/atta... 415508854d
Миниатюры
Запись в файл побитово потоком  
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.11.2014, 09:47 13
BabaSveta, перед выводом first, second, third надо проверять, что значение нормально считалось из файлов. Тут например может помочь http://www.cplusplus.com/refer... am/gcount/
0
1 / 1 / 1
Регистрация: 17.10.2014
Сообщений: 153
09.11.2014, 10:33  [ТС] 14
Я так понял, что cin.gcount() выдаёт кол-во символов, которые считаны. И если следующая строка считала 0 символов, то прекратить считывание. Сделал вот такое вот условие для 1-го файла. Программа выводит не всю информацию, а только часть из файла. Подскажите, что делаю не так, что я не так понимаю) Tulosbe, спасибо тебе большое, спасаешь!)))

C++
1
2
3
4
5
6
7
8
    if((first << cin.gcount()) >0)
        {
            cout << setw(10) << left << char(124);   
            cout << setw(20) << left << first;
            cout << setw(20) << left << second;
            cout << setw(10) << left << third;  
            cout << char(124) << endl;
        }
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.11.2014, 11:03 15
BabaSveta, предлагаю рассмотреть строки 31-42 отдельно:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
 while(fout3.eof()==0 && fout2.eof()==0 && fout1.eof()==0)   //конец файла - истина. Будем делать пока 3 файла выдают ложь
    {
        fout1.read((char*)&first, sizeof(first));
        fout2.read((char*)&second,sizeof(second));
        fout3.read((char*)&third, sizeof(third));
 
        cout << setw(10) << left << char(124);   
        cout << setw(20) << left << first;
        cout << setw(20) << left << second;
        cout << setw(10) << left << third;  
        cout << char(124) << endl;
    }

Но для упрощения, оставить только один файл:
C++
1
2
3
4
5
6
while(fout1.eof()==0)   //конец файла - истина. 
{
        fout1.read((char*)&first, sizeof(first));
 
        cout << setw(20) << left << first << endl;
}
Для понимания работы этого кода надо знать, что eof() вернет true только лишь после попытки прочитать за концом файла.
Т.е. если у нас есть файл на 100 байт и мы считали через read( &var, 100 ) эти 100 байт, eof() будет ещё возвращать false.
Т.к. заранее потоку ввода не известно, когда будет достигнут конец файла. И вот только после попытки чтения 101го байта, eof() станет возвращать true.
Т.о. наверное лучше бы переписать код так (без использования gcount):
C++
1
2
3
4
5
6
7
8
while(1)  
{
    fout1.read((char*)&first, sizeof(first)); // пробуем прочитать данные
 
    if( fout1.eof() ) break; // если прочитали успешно, то eof() == false, иначе - выходим из цикла
 
   cout << setw(20) << left << first << endl; // печатаем только если данные успешно прочитаны
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2014, 11:03
Помогаю со студенческими работами здесь

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

Считывание числа побитово
Помогите пожалуйста. Есть число,скажем 0b00001001. Необходимо каждый бит ДВОИЧНОГО числа сравнить...

как считать побитово в C++?
как считать побитово в C++?

Запись в файл - проверить, не идет ли в него запись, чтобы не генерировалось исключение
Доброе время суток! Вот такой пример: Imports System Imports System.IO Module Module1 ...

Побитово скопировать содержимое переменной
Здравствуйте, есть задача: На языке программирования C++ написать программу для визуализации...

Разбить картинку на пикселям (побитово)
Всем Здрасте! Мне нкжно разбить картинку на пиксели. Я думаю, что поскольку чёрно-белое изображение...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru