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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
#1

Чтение из файла - C++

15.09.2009, 10:44. Просмотров 3096. Ответов 23
Метки нет (Все метки)

Доброго всем дня!
Опишу свою проблему - есть файл с библиотекой данных (размером аж 142 082 049 байт), в одном байте которой хранится 2 значения от 0 до 9 в определенном порядке (ну это не суть важно). Надо эту библиотеку считать из файла в память, чтобы каждое значение было помещено в массив unsigned short int(потому как значения не превышают 9-ти).
Делаю я это следующим образом:
C++
1
2
3
4
5
6
cout<<"1. Чтение библиотеки функций от 5-ти переменных"<<endl;
ifstream fin1("5v_lib2",ios_base::binary);
unsigned fs1=142082049;
char *lib_main=new char[fs1];
fin1.read(lib_main,fs1);
fin1.close();
т.е. считываю весь файл в массив char, т.е. в одном байте не может быть значений больше двух девяток, что в десятичной системе значит 153, но проверка

C++
1
2
3
4
for (int i=0; i<142082049; i++) {if((unsigned short int) lib_main[i]>160){
    cout << (unsigned short int)lib_main[i] << " " <<  i << endl;
    break;}
}
вылетает на 1258987-итерации со значением 65415, хотя вообще не должна, саму библиотеку смотрел HEX-Редактором - все нормально, больших чисел нет, да и быть не может.
Даже не могу сообразить в какую сторону копать...подскажите, плиз.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2009, 10:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из файла (C++):

Переделать в коде чтение из файла в чтение с клавиатуры - C++
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл должен начинаться со слова, между...

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

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.09.2009, 10:50 #2
Цитата Сообщение от Molotoff Посмотреть сообщение
Даже не могу сообразить в какую сторону копать...
я думаю здесь собака зарыта
Цитата Сообщение от Molotoff Посмотреть сообщение
{if((unsigned short int) lib_main[i]>160
ты конвертируешь в unsigned. а что если lib_main[i] вернёт отриц.значение?
0
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
15.09.2009, 12:22  [ТС] #3
Цитата Сообщение от zim22 Посмотреть сообщение
я думаю здесь собака зарыта

ты конвертируешь в unsigned. а что если lib_main[i] вернёт отриц.значение?
значит все дело в собаке! я так и знал!
а вот на счет отрицательного я и не подумал
0
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 14:41 #4
Тут не все так просто!
Имеем массив байтов lib_main, а здесь
C++
1
if((unsigned short int) lib_main[i]>160)
принудительно преобразуем элемент массива к двум байтам. Вопрос - какое состояние присвоится старшему байту?
со значением 65415
в HEX-коде 0хFF87

Выход их этой ситуации - погасить старший байт тоже принудительно
C++
1
if(((unsigned short int)lib_main[i]&0x00FF)>160)
1
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
15.09.2009, 15:51 #5
Вместо
char *lib_main
нужно сделать
unsigned char *lib_main.

Или проверять так:
if ( (unsigned char)lib_main[i]>160 ) ...
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.09.2009, 15:59 #6
Друзья! А у меня такой вопрос в тему. Допускается писать
C++
1
ifstream fin1("5v_lib2",ios_base::binary);
?

У меня в книге так сказано. Пишем либо так
C++
1
ifstream fin1("5v_lib2");
либо так
C++
1
fstream fin1("5v_lib2",ios_base::binary);
Симбиоз не предусмотрен.
0
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 16:25 #7
kravam, это описание fstream : fstream
Т.е. если используем
C
1
ifstream fin1("5v_lib2");
то файл открывается по умолчанию для ввода/вывода.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.09.2009, 17:09 #8
АНК, я не понял.
Вы дали мне ссылку на класс fstream, объявление типа которого действительно открывает файл для ввода вывода.

Но в коде используется не класс fstream, a ifstream
И в правомерности его использования я сомневаюсь потому, что у меня в книге написано:

ifstream это класс для работы с текстовыми файлами. А в программе речь идёт о двоичном файле.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.09.2009, 17:11 #9
Цитата Сообщение от kravam Посмотреть сообщение
ifstream это класс для работы с текстовыми файлами
ifstream provides an interface to read data from files as input streams.
http://cplusplus.com/reference/iostream/ifstream/
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
15.09.2009, 17:20 #10
Цитата Сообщение от kravam Посмотреть сообщение
ifstream это класс для работы с текстовыми файлами. А в программе речь идёт о двоичном файле.
ifstream - только чтение
ofstream - только запись
fstream - чтение и запись
C++
1
ifstream binReader("file.bin",ios::binary);
вот пример потока для работы с бинарным файлом. Что смущает?
0
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 17:23 #11
Цитата Сообщение от kravam Посмотреть сообщение
Но в коде используется не класс fstream, a ifstream
Пардон! Действительно дал маху ... ifstream::ifstream
И здесь, судя по конструктору
C++
1
ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );
файл открывается по умолчанию только на чтение.
А для чтения/записи бинарного файла
C++
1
fstream("5v_lib2", ios_base::in|ios_base::out|ios_base::binary );
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
15.09.2009, 17:36 #12
АНК, невозможно открыть поток для чтения еще и для записи. Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения. Это все равно что в свойство только для чтения попытаться что-то записать
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
15.09.2009, 17:43 #13
M128K145,
То, что компилится, я вижу.
Меня смущает чрезмерное количество конструкций.

Так, например, у меня в книге для работы с текстовыми файлами автором используются только
ifstream - только чтение
ofstream - только запись

А для работы с бинарными
fstream - чтение и запись

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

Я не спорю ни с кем, я только начинаю ООП изучать, но это именно то, что меня и смущает. Просто ответил на вопрос.
0
M128K145
Эксперт С++
8288 / 3508 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
15.09.2009, 17:48 #14
Цитата Сообщение от kravam Посмотреть сообщение
Не знаю я, что за роскошь для каждой операции придумывать отдельное название. Почему тупо не обходиться универсальным fstream?
Это элементарная предосторожность.
Цитата Сообщение от kravam Посмотреть сообщение
я только начинаю ООП изучать
Вот здесь ты поймеш, что это за предосторожность и зачем нужна. Один из основных принципов ООП - инкапсуляция. Поймеш что это - значит ты уже знаеш зачем сделали три класса для работы с потоками, а не 1 двунаправленный
0
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 17:59 #15
Цитата Сообщение от M128K145 Посмотреть сообщение
АНК, невозможно открыть поток для чтения еще и для записи. Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения. Это все равно что в свойство только для чтения попытаться что-то записать
Заявление более, чем странное. Глянем на коструктор
fstream::fstream
C++
1
2
explicit fstream ( const char * filename,
                ios_base::openmode mode = ios_base::in | ios_base::out );
Он означает, что открывая файл таким образом, мы ПОЛУЧАЕМ ВОЗМОЖНОСТЬ писать в этот файл и читать их этого файла. И что бы сменить запись на чтение нам не придется переоткрывать файл.

Добавлено через 6 минут
Цитата Сообщение от kravam Посмотреть сообщение
А для работы с бинарными
fstream - чтение и запись
Нет там openmode mode=ios_base::binary
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2009, 17:59
Привет! Вот еще темы с ответами:

Чтение из файла - C++
Ответьте на вопросы (только не мудрено) 1. Перечислите функции для открытия файла, закрытия файла, чтения данных из файла. 2. Как...

Чтение файла - C++
Знаю, что очень ламерский вопрос... Вот только нихрена не получается! Я и так и сяк вертел... Вобщем, есть файл .txt с записями вида ...

Чтение из файла - C++
Всем привет! Есть одна небольшая проблема. Существует файл input.txt в котором два числа 3 и 5. Вот код: #include&lt;iostream&gt; ...

Чтение файла - C++
Добрый день) Прошу помощи по поводу чтения файла. По сути: к примеру есть файл txt и в нем данные. Вопрос: как вывести эти данные на...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.09.2009, 17:59
Ответ Создать тему
Опции темы

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