1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
1

Чтение из файла

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

Author24 — интернет-сервис помощи студентам
Доброго всем дня!
Опишу свою проблему - есть файл с библиотекой данных (размером аж 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2009, 10:44
Ответы с готовыми решениями:

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

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

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

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

23
depict1
281 / 146 / 4
Регистрация: 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
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50
15.09.2009, 12:22  [ТС] 3
Цитата Сообщение от zim22 Посмотреть сообщение
я думаю здесь собака зарыта

ты конвертируешь в unsigned. а что если lib_main[i] вернёт отриц.значение?
значит все дело в собаке! я так и знал!
а вот на счет отрицательного я и не подумал
0
125 / 116 / 17
Регистрация: 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
Эксперт С++
7175 / 3234 / 81
Регистрация: 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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 16:25 7
kravam, это описание fstream : fstream
Т.е. если используем
C
1
ifstream fin1("5v_lib2");
то файл открывается по умолчанию для ввода/вывода.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
15.09.2009, 17:09 8
АНК, я не понял.
Вы дали мне ссылку на класс fstream, объявление типа которого действительно открывает файл для ввода вывода.

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

ifstream это класс для работы с текстовыми файлами. А в программе речь идёт о двоичном файле.
0
depict1
281 / 146 / 4
Регистрация: 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
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 17:20 10
Цитата Сообщение от kravam Посмотреть сообщение
ifstream это класс для работы с текстовыми файлами. А в программе речь идёт о двоичном файле.
ifstream - только чтение
ofstream - только запись
fstream - чтение и запись
C++
1
ifstream binReader("file.bin",ios::binary);
вот пример потока для работы с бинарным файлом. Что смущает?
0
125 / 116 / 17
Регистрация: 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
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 17:36 12
АНК, невозможно открыть поток для чтения еще и для записи. Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения. Это все равно что в свойство только для чтения попытаться что-то записать
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
15.09.2009, 17:43 13
M128K145,
То, что компилится, я вижу.
Меня смущает чрезмерное количество конструкций.

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

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

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

Я не спорю ни с кем, я только начинаю ООП изучать, но это именно то, что меня и смущает. Просто ответил на вопрос.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 17:48 14
Цитата Сообщение от kravam Посмотреть сообщение
Не знаю я, что за роскошь для каждой операции придумывать отдельное название. Почему тупо не обходиться универсальным fstream?
Это элементарная предосторожность.
Цитата Сообщение от kravam Посмотреть сообщение
я только начинаю ООП изучать
Вот здесь ты поймеш, что это за предосторожность и зачем нужна. Один из основных принципов ООП - инкапсуляция. Поймеш что это - значит ты уже знаеш зачем сделали три класса для работы с потоками, а не 1 двунаправленный
0
125 / 116 / 17
Регистрация: 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
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 18:02 16
Цитата Сообщение от АНК Посмотреть сообщение
C++
1
ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );
файл открывается по умолчанию только на чтение.
а теперь читаем внимательнее
Цитата Сообщение от M128K145 Посмотреть сообщение
Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения.
Он не по умолчанию открывается на чтение, он всегда открывается только для чтения
0
depict1
281 / 146 / 4
Регистрация: 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
);
0
125 / 116 / 17
Регистрация: 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 );
Что произойдет по Вашему?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 18:48 19
АНК, приведи мне пример такой реализации
C++
1
ifstream ifs(filename, ios_base::out);
для записи в файл или
C++
1
ofstream ofs(filename, ios_base::in);
для чтения из файла. Если ты напишеш это, я извинюсь и скажу, что был не прав
0
125 / 116 / 17
Регистрация: 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");
открывает файл в режиме "текст"
1
15.09.2009, 19:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2009, 19:57
Помогаю со студенческими работами здесь

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

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

Чтение текстового файла специфического файла
Добрый день! Есть один текстовый файл определенного формата. Заголовок по столбцам такой: год...

Чтение файла с n строки и до конца файла
как сделать так чтобы писало не с начала файла а например с середины и до конца? fstream...


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

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

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