Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
1 / 1 / 0
Регистрация: 21.07.2009
Сообщений: 50

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

15.09.2009, 10:44. Показов 4927. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
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; using namespace std; struct...

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

ты конвертируешь в unsigned. а что если lib_main[i] вернёт отриц.значение?
значит все дело в собаке! я так и знал!
а вот на счет отрицательного я и не подумал
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 14:41
Тут не все так просто!
Имеем массив байтов 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
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
15.09.2009, 15:51
Вместо
char *lib_main
нужно сделать
unsigned char *lib_main.

Или проверять так:
if ( (unsigned char)lib_main[i]>160 ) ...
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
15.09.2009, 15:59
Друзья! А у меня такой вопрос в тему. Допускается писать
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
kravam, это описание fstream : fstream
Т.е. если используем
C
1
ifstream fin1("5v_lib2");
то файл открывается по умолчанию для ввода/вывода.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
15.09.2009, 17:09
АНК, я не понял.
Вы дали мне ссылку на класс fstream, объявление типа которого действительно открывает файл для ввода вывода.

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

ifstream это класс для работы с текстовыми файлами. А в программе речь идёт о двоичном файле.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.09.2009, 17:11
Цитата Сообщение от kravam Посмотреть сообщение
ifstream это класс для работы с текстовыми файлами
ifstream provides an interface to read data from files as input streams.
http://cplusplus.com/reference/iostream/ifstream/
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 17:20
Цитата Сообщение от 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
Цитата Сообщение от 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Эксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 17:36
АНК, невозможно открыть поток для чтения еще и для записи. Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения. Это все равно что в свойство только для чтения попытаться что-то записать
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
15.09.2009, 17:43
M128K145,
То, что компилится, я вижу.
Меня смущает чрезмерное количество конструкций.

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

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

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

Я не спорю ни с кем, я только начинаю ООП изучать, но это именно то, что меня и смущает. Просто ответил на вопрос.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 17:48
Цитата Сообщение от kravam Посмотреть сообщение
Не знаю я, что за роскошь для каждой операции придумывать отдельное название. Почему тупо не обходиться универсальным fstream?
Это элементарная предосторожность.
Цитата Сообщение от kravam Посмотреть сообщение
я только начинаю ООП изучать
Вот здесь ты поймеш, что это за предосторожность и зачем нужна. Один из основных принципов ООП - инкапсуляция. Поймеш что это - значит ты уже знаеш зачем сделали три класса для работы с потоками, а не 1 двунаправленный
0
125 / 116 / 17
Регистрация: 27.02.2007
Сообщений: 291
15.09.2009, 17:59
Цитата Сообщение от 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Эксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 18:02
Цитата Сообщение от АНК Посмотреть сообщение
C++
1
ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );
файл открывается по умолчанию только на чтение.
а теперь читаем внимательнее
Цитата Сообщение от M128K145 Посмотреть сообщение
Он просто однонаправленный и хоть по умолчанию, хоть нет, он всегда будет только для чтения.
Он не по умолчанию открывается на чтение, он всегда открывается только для чтения
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
15.09.2009, 18:03
Цитата Сообщение от АНК Посмотреть сообщение
Нет там 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
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Эксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
15.09.2009, 18:48
АНК, приведи мне пример такой реализации
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
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2009, 19:57
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru