|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
|
Динамическое сохранение информации из файла06.03.2015, 23:49. Показов 751. Ответов 9
Метки нет (Все метки)
Добрый вечер!
Хочу считать информацию из файла заранее неизвестного размера. Не хочу определять огромный массив char ch [100000], поэтому 2 варианта: 1) создать поток и узнать размер файла, создать массив под нужное количество байт, затем снова прочитать файл, но уже с записью данных в массив 2) создать строку и в нее писать Оба варианта как-то не очень корректно работают. Подскажите, пожалуйста, почему так происходит. Примеры ниже. Вариант 1: #include <iostream> #include <fstream> #include <stdlib.h> using namespace std; int main () { char ch; int size = 0; ifstream inStream1("fdfb180f1d7f.tga", ios::in | ios::binary); //открыли файл, чтобы узнать размер inStream.seekg (0, std::ios::end); size = inStream1.tellg(); // узнали сколько байт в файле inStream1.close(); //закрыли cout << "size : " << size << " баит\n"; char newPicture [size]; // определили массив i = 0; ifstream inStream2("fdfb180f1d7f.tga", ios::in | ios::binary); //открыли заново файл, чтобы считывать while (inStream2.get(ch)) { //считываем в него байты из файла newPicture[i] = ch; i++; } inStream2.close(); cout << "i = " << i << "\n"; // для проверки, что размер соответствует return 0; } Выводит так: size : 15967934 Segmentation fault (core dumped) То есть не хочет открывать поток. А работать с тем же не получается, тоже Segmentation fault выводит. Вариант 2: #include <iostream> #include <fstream> #include <stdlib.h> using namespace std; int main () { int i = 0; string str; ifstream inStream("fdfb180f1d7f.tga", ios::in | ios::binary); while (inStream.get(ch)) { str += ch; i++; } inStream.close(); cout << "i = " << i << "\n"; return 0; } Выводит это: i = 15967934 sizeof str = 8 То есть не до конца читает почему-то. Возможно здесь нужно с указателем работать, но как символы из inStream.get будет туда писаться не очень понимаю.
0
|
|
| 06.03.2015, 23:49 | |
|
Ответы с готовыми решениями:
9
Считывание из файла и сохранение записанной в программе информации в файл Парсинг XML файла и сохранение информации из файла в структуре или массиве Считывание из файла и вывод на экран (сохранение записанной в программе информации в файл) |
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
| 07.03.2015, 00:01 | ||||||
|
Немного магии (и С++11)
0
|
||||||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
|
| 07.03.2015, 00:24 [ТС] | |
|
castaway, что именно? Давайте поясню.
Мне скопировать байты из файла нужно, но не знаю заранее под сколько байт массив charов выделять. Добавлено через 1 минуту MrGluck, с удовольствием бы использовала, но у меня не С++11, желательно бы на старой версии реализовать
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||
| 07.03.2015, 01:04 | |||||||
0
|
|||||||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
|
| 07.03.2015, 07:52 [ТС] | |
|
MrGluck, это просто для вывода на экран? Значения сохраняются где-то? Здесь нет массива байтов из файла и переменной, хранящий его размер...либо я не вижу(
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||
| 07.03.2015, 11:50 | |||||||
|
Более явно это видно вот так:
0
|
|||||||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
|
| 07.03.2015, 22:19 [ТС] | |
|
MrGluck, здесь str как функция, а не переменная? Судя по ошибке, которая возникает, когда я хочу узнать размер str...
Проблема разрешилась таким образом (может кому интересно): int main () { FILE *filePicture; long lSize; char *buffer; size_t result; filePicture = fopen ( "fdfb180f1d7f.tga", "rb"); if (filePicture == NULL) cout << "File can't open\n"; fseek(filePicture , 0 , SEEK_END); lSize = ftell(filePicture); rewind(filePicture); buffer = (char*) malloc(sizeof(char) * lSize); if (buffer == NULL) cout << "Memory error\n"; result = fread(buffer, 1, lSize, filePicture); if (result != lSize) cout << "Reading error\n"; cout << "size = " << lSize << "\n"; cout << "result = " << result << "\n"; fclose (filePicture); free (buffer); return 0; }
0
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||
| 07.03.2015, 22:24 | |||||||
1
|
|||||||
|
3 / 3 / 0
Регистрация: 02.01.2015
Сообщений: 24
|
|
| 07.03.2015, 22:27 [ТС] | |
|
MrGluck, наверное стоит почитать про итераторы...ни разу не сталкивалась)
Спасибо)
0
|
|
| 07.03.2015, 22:27 | |
|
Помогаю со студенческими работами здесь
10
Запись текста в файл\вывод его на экран\сохранение\считывание информации из файла Добавить к программе след действия: Сохранение и загрузка информации в текст. файл. Сохранение и загрузка информации в типизированный файл.
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|