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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.83
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
15.09.2009, 10:44     Чтение из файла #1
Доброго всем дня!
Опишу свою проблему - есть файл с библиотекой данных (размером аж 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-Редактором - все нормально, больших чисел нет, да и быть не может.
Даже не могу сообразить в какую сторону копать...подскажите, плиз.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2009, 10:44     Чтение из файла
Посмотрите здесь:

Чтение из файла C++
C++ Чтение из файла
C++ Чтение файла
Чтение из файла. Повторное чтение файла C++
Чтение из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
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] вернёт отриц.значение?
Molotoff
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
15.09.2009, 12:22  [ТС]     Чтение из файла #3
Цитата Сообщение от zim22 Посмотреть сообщение
я думаю здесь собака зарыта

ты конвертируешь в unsigned. а что если lib_main[i] вернёт отриц.значение?
значит все дело в собаке! я так и знал!
а вот на счет отрицательного я и не подумал
АНК
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)
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
15.09.2009, 15:51     Чтение из файла #5
Вместо
char *lib_main
нужно сделать
unsigned char *lib_main.

Или проверять так:
if ( (unsigned char)lib_main[i]>160 ) ...
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
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);
Симбиоз не предусмотрен.
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 16:25     Чтение из файла #7
kravam, это описание fstream : fstream
Т.е. если используем
C
1
ifstream fin1("5v_lib2");
то файл открывается по умолчанию для ввода/вывода.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
15.09.2009, 17:09     Чтение из файла #8
АНК, я не понял.
Вы дали мне ссылку на класс fstream, объявление типа которого действительно открывает файл для ввода вывода.

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

ifstream это класс для работы с текстовыми файлами. А в программе речь идёт о двоичном файле.
zim22
depict1
 Аватар для zim22
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/
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2009, 17:20     Чтение из файла #10
Цитата Сообщение от kravam Посмотреть сообщение
ifstream это класс для работы с текстовыми файлами. А в программе речь идёт о двоичном файле.
ifstream - только чтение
ofstream - только запись
fstream - чтение и запись
C++
1
ifstream binReader("file.bin",ios::binary);
вот пример потока для работы с бинарным файлом. Что смущает?
АНК
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 );
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2009, 17:36     Чтение из файла #12
АНК, невозможно открыть поток для чтения еще и для записи. Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения. Это все равно что в свойство только для чтения попытаться что-то записать
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
15.09.2009, 17:43     Чтение из файла #13
M128K145,
То, что компилится, я вижу.
Меня смущает чрезмерное количество конструкций.

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

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

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

Я не спорю ни с кем, я только начинаю ООП изучать, но это именно то, что меня и смущает. Просто ответил на вопрос.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2009, 17:48     Чтение из файла #14
Цитата Сообщение от kravam Посмотреть сообщение
Не знаю я, что за роскошь для каждой операции придумывать отдельное название. Почему тупо не обходиться универсальным fstream?
Это элементарная предосторожность.
Цитата Сообщение от kravam Посмотреть сообщение
я только начинаю ООП изучать
Вот здесь ты поймеш, что это за предосторожность и зачем нужна. Один из основных принципов ООП - инкапсуляция. Поймеш что это - значит ты уже знаеш зачем сделали три класса для работы с потоками, а не 1 двунаправленный
АНК
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
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2009, 18:02     Чтение из файла #16
Цитата Сообщение от АНК Посмотреть сообщение
C++
1
ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );
файл открывается по умолчанию только на чтение.
а теперь читаем внимательнее
Цитата Сообщение от M128K145 Посмотреть сообщение
Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения.
Он не по умолчанию открывается на чтение, он всегда открывается только для чтения
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
15.09.2009, 18:03     Чтение из файла #17
Цитата Сообщение от АНК Посмотреть сообщение
Нет там openmode mode=ios_base::binary
C++
1
2
3
4
5
explicit basic_fstream(
    const char *_Filename,
    ios_base::openmode _Mode = ios_base::in | ios_base::out,
    int _Prot = (int)ios_base::_Openprot
);
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 18:21     Чтение из файла #18
zim22, Это все прекрасно. Смотрим тут
C++
1
2
3
basic_fstream();
explicit basic_fstream  ( const char * filename, 
   ios_base::openmode mode = ios_base::in | ios_base::out);
Добавлено через 8 минут
Цитата Сообщение от M128K145 Посмотреть сообщение
Он не по умолчанию открывается на чтение, он всегда открывается только для чтения
А если открыть файл с явно указанным openmode mode? На пример:
C++
1
ifstream (filename, ios_base::out );
Что произойдет по Вашему?
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
15.09.2009, 18:48     Чтение из файла #19
АНК, приведи мне пример такой реализации
C++
1
ifstream ifs(filename, ios_base::out);
для записи в файл или
C++
1
ofstream ofs(filename, ios_base::in);
для чтения из файла. Если ты напишеш это, я извинюсь и скажу, что был не прав
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2009, 19:57     Чтение из файла
Еще ссылки по теме:

Чтение из Файла C++
Чтение файла C++
Чтение файла с несколькими знаками конца файла C++

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

Или воспользуйтесь поиском по форуму:
АНК
124 / 115 / 2
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 19:57     Чтение из файла #20
Цитата Сообщение от M128K145 Посмотреть сообщение
АНК, приведи мне пример такой реализации
Пожалуйста, только сейчас проверял
C++
1
2
3
4
5
6
7
8
9
10
11
12
  char bf[600] = {0};
  ifstream *filestr = new ifstream("asd.txt", ios_base::out|ios_base::binary);
  try {
    filestr->read(bf, 550);
    bf[0] = 0;
    filestr->seekg(0, ios::beg);
    ((ofstream*)filestr)->write(bf, 10);
  }
  __finally {
    filestr->close();
    delete filestr;
  }
Но это, естественно, извращение, так что извиняться не надо. Просто принципиально такая возможность есть...

Добавлено через 24 минуты
zim22, эксперимент показал, что
C++
1
fstream *filestr = new fstream("asd.txt");
открывает файл в режиме "текст"
Yandex
Объявления
15.09.2009, 19:57     Чтение из файла
Ответ Создать тему
Опции темы

Текущее время: 03:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru