Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390

Почему так(комбинации бинарных и не бинарных вводов и выводов)?

15.06.2015, 18:55. Показов 1705. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
 
using namespace std;
 
int main()
{
    setlocale(0,"Rus");
    string a;
    a.resize(256);
    for (int i = 0; i < 256; i++)
        a[i] = (char)i;
    ofstream fout;
    fout.open("fout.txt");
    fout << a;
    fout.close();
    fout.open("fout1.txt", ios::binary);
    fout << a;
    fout.close();
    ifstream fin;
    string b;
    char temp;
    //
    fin.open("fout.txt");
    fin.get(temp);
    while (!fin.eof())
    {
        b += temp;
        fin.get(temp);
    }
    if (b == a)
        cout << "не бинарный ввод и не бинарное чтение ОК";
    else cout << "не бинарный ввод и не бинарное чтение BAD";
    fin.close();
    b.clear();
    cout << endl;
    //
    //
    fin.open("fout.txt",ios::binary);
    fin.get(temp);
    while (!fin.eof())
    {
        b += temp;
        fin.get(temp);
    }
    if (b == a)
        cout << "не бинарный ввод и  бинарное чтение ОК";
    else cout << "не бинарный ввод и  бинарное чтение BAD";
    fin.close();
    b.clear();
    cout << endl;
    //
    //
    fin.open("fout1.txt");
    fin.get(temp);
    while (!fin.eof())
    {
        b += temp;
        fin.get(temp);
    }
    if (b == a)
        cout << "бинарный ввод и не бинарное чтение ОК";
    else cout << "бинарный ввод и не бинарное чтение BAD";
    fin.close();
    b.clear();
    cout << endl;
    //
    //
    fin.open("fout1.txt",ios::binary);
    fin.get(temp);
    while (!fin.eof())
    {
        b += temp;
        fin.get(temp);
    }
    if (b == a)
        cout << "бинарный ввод и  бинарное чтение ОК";
    else cout << "бинарный ввод и бинарное чтение BAD";
    fin.close();
    b.clear();
    cout << endl;
    //
    system("pause");
 
    return 0;
}
может мне кто нибудь обьяснить почему так происходит, только подробно, ответ "потому что не бинарный ввод\вывод некоторые символы приравнивает к одному" не подходит, конкретнее

простите за то что заставляю вас это компилировать, в общем там ОК только в последнем случае, бинарный ввод и вывод
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.06.2015, 18:55
Ответы с готовыми решениями:

Создание бинарных файлов. Чтение и запись бинарных файлов
Здраствуйте. Сколько я не рылся в нете сколько не искал, как то все не доходит до меня тупого). На работе есть задание: 1. есть данные...

Перенос строк после бинарных операторов - почему?
Почему рекомендуется переносить строки после указания бинарного оператора? Есть ли какие-то старые браузеры, которые пытались ставить...

Создание и просмотр бинарных файлов: почему в результате работы программы компоненты печатаются не в том порядке?
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt; #include &lt;locale.h&gt; #include &lt;string&gt; #include &lt;set&gt; void...

18
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.06.2015, 21:39
Цитата Сообщение от Krock21rus Посмотреть сообщение
может мне кто нибудь обьяснить почему так происходит
Так - это как?
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 21:49  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Так - это как?
Цитата Сообщение от Krock21rus Посмотреть сообщение
простите за то что заставляю вас это компилировать, в общем там ОК только в последнем случае, бинарный ввод и вывод
теперь понятно, или разьяснить как работает программа?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.06.2015, 22:25
Лучший ответ Сообщение было отмечено Krock21rus как решение

Решение

Цитата Сообщение от Krock21rus Посмотреть сообщение
теперь понятно, или разьяснить как работает программа?
Чем в коде разбираться, проще словами сказать: если записать в файл не текст, а потом читать его не в бинарном режиме, то файл может не полностью считываться.
В той теме, где ты оставил пост, я коротко написал об этом: Мой алгоритм дешифрует не все
Более развёрнуто:
если в файле присутствуете байт со значением 26, то, при открытии для чтения в текстовом режиме, он будет обработан, как конец файла (eof() выдаст true), вне зависимости от методов чтения (что и происходит у тебя в коде). При открытии в бинарном режиме, этого не произойдёт, вне зависимости от методов чтения.

Добавлено через 32 минуты
Объяснение понятно? Или?..
1
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 23:24  [ТС]
Цитата Сообщение от lss Посмотреть сообщение
Чем в коде разбираться, проще словами сказать: если записать в файл не текст, а потом читать его не в бинарном режиме, то файл может не полностью считываться.
В той теме, где ты оставил пост, я коротко написал об этом: Мой алгоритм дешифрует не все
Более развёрнуто:
если в файле присутствуете байт со значением 26, то, при открытии для чтения в текстовом режиме, он будет обработан, как конец файла (eof() выдаст true), вне зависимости от методов чтения (что и происходит у тебя в коде). При открытии в бинарном режиме, этого не произойдёт, вне зависимости от методов чтения.
да, понятно, то есть при бинарной записи записывается всё, игнорируя '\0', при бинарном чтении читается всё, игнорируя '\0'
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.06.2015, 23:41
Цитата Сообщение от Krock21rus Посмотреть сообщение
вы уверены в своих словах?
Какие-то сомнения? По поводу?

Добавлено через 16 минут
Цитата Сообщение от Krock21rus Посмотреть сообщение
да, понятно, то есть при бинарной записи записывается всё, игнорируя '\0', при бинарном чтении читается всё, игнорируя '\0'
Нужно разделить понятия: режим открытия файла (бинарный, текстовый) и методы четния\записи (бинарные, текстовые). Одно влияет на одно, другое на другое. О чём речь?
Терминальные нули здесь вообще не при делах, они и текстовыми методами в файл не записываются, а поэтому и не считываются (их добавляют метды текстового чтения).
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
15.06.2015, 23:42  [ТС]
lss, просто я долго экспериментировал с автором темы "Мой алгоритм дешифрует не все"
и там, видимо из-за fout.write((char*)&c, sizeof(c)); выводился и '\0' в не бинарном режиме, я так понимаю .write тоже без разницы какой символ, оно просто берёт из указателя нужное кол-во байт и записывает его в файл, даже если файл открыт не в бинарном режиме
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.06.2015, 23:55
Бинарные методы чтения/записи оперируют байтами, но режим открытия файла влияет и на них.

Добавлено через 2 минуты
Цитата Сообщение от Krock21rus Посмотреть сообщение
я так понимаю .write тоже без разницы какой символ, оно просто берёт из указателя нужное кол-во байт и записывает его в файл, даже если файл открыт не в бинарном режиме
Вот если не в бинарном, то будет тоже, что и в твоём коде. Проверь его с write() и read().

Добавлено через 9 минут
Вот, например, такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    char a[30];
    for (int i = 0; i < 30; i++)
        a[i] = (char)i;
    
    fstream fout("fout.txt");
    fout.write(a, 30);
    fout.flush();
 
    char b[30] = {};
 
    fout.seekg(0);
    fout.read(b, 30);
    fout.close();
 
    for (int i = 0; i < 30; ++i)
        cout << (int)b[i] << ' ';
   
    cout << endl;
    system("pause");
И вывод считанного. Чтение прекращается на байте со значением 26, который, в текстовом режиме, толкуется как конец файла, и бинарные методы не помогают это обойти, если файл открыт в текстовом режиме.
Миниатюры
Почему так(комбинации бинарных и не бинарных вводов и выводов)?  
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
16.06.2015, 00:25
Цитата Сообщение от lss Посмотреть сообщение
Терминальные нули здесь вообще не при делах, они и текстовыми методами в файл не записываются, а поэтому и не считываются
Вы ошибаетесь, записываются в том числе и текстовыми, не записываются только в пределах реализации std::string записи в файл.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
16.06.2015, 00:52
Цитата Сообщение от smartpointer Посмотреть сообщение
ошибаетесь, записываются в том числе и текстовыми
В том числе, тут не к месту, бинарные методы пишут столько байтов сколько указано, хоть за пределом выделенной для строки памяти. Текстовые методы терминальные ноли в файл не записывают. cout выводит на консоль '\0'? Так же работают и файловые потоки для записи. Запиши текстовым методом строку, потом считай посимвольно, с выводом кодов, и увидишь, что никакого '\0' в файле нет.

Добавлено через 3 минуты
Да, даже по размеру файла, без вывода, будет видно, что нет.
1
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
16.06.2015, 01:01
Цитата Сообщение от lss Посмотреть сообщение
Текстовые методы терминальные ноли в файл не записывают.
Получается этот код мне нули не запишет?
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <fstream>
 
int main()
{
    FILE* file = fopen("test.txt","w");
    char sym[] = {'\0','\0','\0','\0','\0'};
    fwrite(sym,sizeof(char),sizeof(sym)/sizeof(char),file);
    return 0;
}
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
16.06.2015, 01:05
Цитата Сообщение от smartpointer Посмотреть сообщение
Получается этот код мне нули не запишет?
А где здесь текстовый метод? fwrite() давно таким стал?
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
16.06.2015, 01:15
Цитата Сообщение от lss Посмотреть сообщение
А где здесь текстовый метод? fwrite() давно таким стал?
Текстовый метод - 2 аргумент "w" , но можете добавить "wt" - вопрос остается открытым, добавятся ли нули в файл ? fwrite - это сишный вариант.
P.S прошу прощения библиотека не fstream а cstdio.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
16.06.2015, 01:18
Цитата Сообщение от smartpointer Посмотреть сообщение
Текстовый метод - 2 аргумент "w"
Тогда ещё раз:
Цитата Сообщение от lss Посмотреть сообщение
Нужно разделить понятия: режим открытия файла (бинарный, текстовый) и методы четния\записи (бинарные, текстовые). Одно влияет на одно, другое на другое. О чём речь?
Второй аргумент w - это режим открытия файла (текстовый). fwrite() - это функция записи (бинарная).
Цитата Сообщение от lss Посмотреть сообщение
Текстовые методы терминальные ноли в файл не записывают.
В твоём коде нет текстового метода (текстовой Си-функции).
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
16.06.2015, 02:06
Не сильно силен в std-шном варианте, вот аналог и он записывает как текстовый а не бинарный?
C++
1
2
3
4
5
6
7
8
9
10
#include <fstream>
 
int main()
{
    std::ofstream out("text.txt", std::ios::out);
    char a[5] = {'\0','\0','\0','\0','\0'};
    out.write(a,5);
    out.close();
    return 0;
}
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
16.06.2015, 02:12
Цитата Сообщение от smartpointer Посмотреть сообщение
out.write(a,6);
write() - бинарный метод, запишет 6 байтов. Текстовый: <<.
Вот так запиши и посмотри размер файла (для текстового метода, a - это пустая строка):
C++
1
2
3
4
    std::ofstream out("text.txt", std::ios::out);
    char a[6] = {'\0','\0','\0','\0','\0'};
    out << a;
    out.close();
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
16.06.2015, 03:28
Еще раз скажу кривой оператор<< никак не связан с режимом открытия файла, поскольку это просто форматированный вариант функции write, он попросту будет читать до первого встретившегося '\0' - попробуйте ввести такую строку "Пр\0ивет". В методе write он прочитает все правильно и в текстовом и в бинарном - единственное различие будет то, что некоторые символы будут представлены как еще один дополнительный байт, и нули в текстовом формате никуда не денутся.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
16.06.2015, 03:35
Цитата Сообщение от smartpointer Посмотреть сообщение
Еще раз скажу кривой оператор<< никак не связан с режимом открытия файла
Не связан. Ты возразил против этого:
Цитата Сообщение от lss Посмотреть сообщение
Терминальные нули здесь вообще не при делах, они и текстовыми методами в файл не записываются
Цитата Сообщение от smartpointer Посмотреть сообщение
Вы ошибаетесь, записываются в том числе и текстовыми,
Ещё раз: текстовые методы и функции терминальные ноли в файл не записывают, при любом режиме открытия файла.
А ты опять пишешь о режимах окрытия файла:
Цитата Сообщение от smartpointer Посмотреть сообщение
В методе write он прочитает все правильно и в текстовом и в бинарном
В трёх соснах разберись как-то. Ещё раз, последний:
Цитата Сообщение от lss Посмотреть сообщение
Нужно разделить понятия: режим открытия файла (бинарный, текстовый) и методы четния\записи (бинарные, текстовые). Одно влияет на одно, другое на другое.
От темы отписался.
0
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
16.06.2015, 03:54
Цитата Сообщение от lss Посмотреть сообщение
Не связан. Ты возразил против этого:
И продолжу настаивать на этом (то что нули будут записываться в файл в любом режиме, кроме реализаций методов где явно они отменяются ), ждем ответа эксперта.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.06.2015, 03:54
Помогаю со студенческими работами здесь

Чтение бинарных файлов
Здравствуйте уважаемые эксперты,хотелось бы узнать как можно прочитать шестнадцатиричные значения из файла,длиной 1б,в блок размером...

Перегрузка бинарных операторов в C#
Здравствуйте. Прошу,помогите решить задачу.Сама пробовала решить так преподаватель сказал что надо более просто сделать,а куда проще не...

О кодировке бинарных файлов
Здравствуйте;Тут такая проблема:Как заполнять бинарные файлы? Просто я если создаю обычный файл и пихаю туда обычные числа то он...

Свойства бинарных отношений
Отношение x^2-y^2≦1 Выяснить, какими свойствами( рефлексивность, антирефлексивность, транзитивность , симметричность,...

Запись бинарных файлов
открываю в hex-редакторе бинарный файл, там написано 41 54 26 54 вопрос как мне это записать в файл, чтобы этот файл можно было...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru