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

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

Войти
Регистрация
Восстановить пароль
 
MayaNash
1285 / 453 / 48
Регистрация: 24.08.2011
Сообщений: 2,214
#1

Ошибка при записи в бинарный файл - C++

09.05.2014, 11:09. Просмотров 363. Ответов 8
Метки нет (Все метки)

Задание - записать в бинарный файл последовательность из N байт вида "00001111 11110000 00001111 ...".
Почему-то 11110000 записывается неправильно. Это 240 в десятичной и F0 в шестнадцатеричной системе, но при считывании получается FFFFFFF0. И дублируется последний байт. Почему?
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
#include <iostream>
#include <fstream>
using std::ifstream;
using std::ofstream;
using std::cin;
using std::cout;
using std::endl;
using std::ios;
 
void main()
{
    int n;
    setlocale(LC_ALL,"rus");
    cout << "Введите N: ";
    cin >> n; // вводим количество байтов
 
    char byte[2] = {15,240};
    ofstream fout("binfile",ios::binary);
    for (int i = 0; i < n; i++)
        fout.write(&byte[i%2], 1);
    fout.close();
 
    ifstream fin("binfile",ios::binary);
    char ch;
    while (!fin.eof())
    {
        fin.read(&ch,1);
        cout << std::hex << (int)ch << " ";
    }
    cout << endl;
    fin.close();
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 11:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при записи в бинарный файл (C++):

Ошибка при записи или чтении в бинарный файл - C++
Есть такие вот типы данных: struct Nomer { int n, tsena1Deni; string klass; int kMest, kZaselenii; bool svoboden; Nomer...

Баг при использовании класса string при записи в бинарный файл - C++
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце...

Бинарный файл, ошибка при чтении символов - C++
Здравствуйте, нужна помощь. Среда MS VS 2013 &quot;Ошибка при чтении символов&quot;, чтении происходит из бинарного файла. А вот что при выводе...

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

Ошибка при записи в файл - C++
помогите, вылетает ошибка при записи в файл ф-я void add_in_file(int n) что не так? #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

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

8
nmcf
5763 / 5074 / 1734
Регистрация: 14.04.2014
Сообщений: 20,774
09.05.2014, 11:14 #2
У тебя массив byte фиксированной длины. Для чего вводить n? А если введут 10? Будет чтение за границами массива. И почему byte[i%2], а не byte[i]?
0
MayaNash
1285 / 453 / 48
Регистрация: 24.08.2011
Сообщений: 2,214
09.05.2014, 11:31  [ТС] #3
Обрати внимание, что если введут 10, то все будет нормально. i%2 - это остаток от деления на 2, то есть или 0 или 1. Так что выхода за границы по сути быть не может. Вопрос вообще не в этом.

Добавлено через 2 минуты
Задание конечно глупое, но как ни крути, в файле должны чередоваться 2 байта - 15 и 240. И всего должно быть N байтов.
0
0x10
2526 / 1706 / 257
Регистрация: 24.11.2012
Сообщений: 4,269
09.05.2014, 11:39 #4
Керра, пишется и читается все верно. Второй байт - действительно 0xF0. Но вспомним, что char - знаковый. Т.е. это значение интерпретируется как -16. Приводим к int - получаем то же значение -16, но уже в ячейчке размером 4 байта. Что в дополнительном коде как раз 0xfffffff0.
0
MayaNash
1285 / 453 / 48
Регистрация: 24.08.2011
Сообщений: 2,214
09.05.2014, 11:43  [ТС] #5
Ясно, и что делать? abs не помогает
0
nmcf
5763 / 5074 / 1734
Регистрация: 14.04.2014
Сообщений: 20,774
09.05.2014, 11:44 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Лишний байт у тебя выходит из-за того, что флаг конца файла устанавливается только после неудачного чтения, поэтому одна лишняя итерация выполняется после чтения последнего символа. Тебе нужно после read(), например peek() вызвать, чтобы флаг был установлен. Или ещё что-то придумать, может читать исходя из размера файла.
1
0x10
2526 / 1706 / 257
Регистрация: 24.11.2012
Сообщений: 4,269
09.05.2014, 11:48 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Керра, в выводе можно вот такую загогулину воткнуть.
C++
1
static_cast<int>(static_cast<unsigned char>(ch))
1
MayaNash
1285 / 453 / 48
Регистрация: 24.08.2011
Сообщений: 2,214
09.05.2014, 11:52  [ТС] #8
nmcf, 0x10, спасибо, помогло
0
nmcf
5763 / 5074 / 1734
Регистрация: 14.04.2014
Сообщений: 20,774
09.05.2014, 11:53 #9
У меня вот так работает:
C++
1
(int)(unsigned char)ch
0
09.05.2014, 11:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2014, 11:53
Привет! Вот еще темы с ответами:

Ошибка при записи данных в файл - C++
Для записи перменной типа string выделяю динамически массив из 64 элементов char,после записи данных освобождаю память,но почему-то при...

Генератор случайных чисел для записи в бинарный файл - C++
Здравствуйте. Есть задача: В файле содержатся числа. Сформировать квадратную матрицу из 25 последних чисел файла. Посчитать сумму...

Ошибка при записи в файл через библиотеку io.h - C++
Приветствую всех! Пишу программу, в которой необходимо записывать информацию в файл. Для этого использовал функцию _write из библиотеки...

Как записать в бинарный файл структуры записи из текстового файла? - C++
Здравствуйте! Прошу помочь с чтением из текстового файла а затем запись всего что записано в структуру в бинарный файл. Есть текстовый...


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

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

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