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

Программирование мобильных систем

Войти
Регистрация
Восстановить пароль
 
Vl@disl@v
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 9
#1

Как правильно писать/считывать бинарные файлы в Windows Store Apps? - Программирование

16.02.2014, 13:37. Просмотров 907. Ответов 0
Метки нет (Все метки)

Здравствуйте. Раньше, до WinRT, я использовал функции fopen, fwrite, fread и пр., или через потоки ifstream, ofstream. Я мог легко писать n-ое кол-во байт данных любого типа в файл. В WinRT функция fopen для записи не открывает файл. Ладно, вроде как нашел способ. Использую этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    auto item = KnownFolders::PicturesLibrary;
 
    auto mas_x = new int32[10];
    for (int i = 0; i < 10; i++)
    {
        mas_x[i] = i;
    }
    auto arr = ref new Array<unsigned char>((unsigned char*)mas_x, 10 * sizeof(int32));
    auto m_istream = ref new InMemoryRandomAccessStream();
    auto dw = ref new DataWriter(m_istream->GetOutputStreamAt(0));
    dw->WriteBytes(arr);
 
    task<unsigned int>(dw->StoreAsync()).then([=](unsigned int)
    {
        return m_istream->FlushAsync();
    }).then([=](bool)
    {
        return item->CreateFileAsync(filename, CreationCollisionOption::ReplaceExisting);
    }).then([=](StorageFile^ storageFile)
    {
        return storageFile->OpenAsync(FileAccessMode::ReadWrite);
    }).then([=](IRandomAccessStream^ new_stream)
    {
        return RandomAccessStream::CopyAsync(m_istream->GetInputStreamAt(0), new_stream->GetOutputStreamAt(0));
    }).then([=](UINT64 copiedBytes)
    {
        dw->DetachStream();
    });
После записи файл действительно имеет объем 40 байт, и в нем, как я надеюсь, хранятся числа от 0 до 9.
дальше пишу метод
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void ReadFromFile(Platform:: String^ filename)
{
    auto item = KnownFolders::PicturesLibrary;
    task<StorageFile^> getFileTask(item->GetFileAsync(filename));
    getFileTask.then([=](StorageFile^ storageFile)
    {
        task<FileProperties::BasicProperties^> getBasicPropertiesTask(storageFile->GetBasicPropertiesAsync());
        return getBasicPropertiesTask.then([=](FileProperties::BasicProperties^ basicProperties)
        {
            auto size = unsigned int(basicProperties->Size);
            if (size != basicProperties->Size) throw ref new FailureException("Session state larger than 4GB");
            task<IRandomAccessStreamWithContentType^> openReadTask(storageFile->OpenReadAsync());
            return openReadTask.then([=](IRandomAccessStreamWithContentType^ fileStream)
            {
                auto reader = ref new DataReader(fileStream);
                return task<unsigned int>(reader->LoadAsync(size)).then([=](unsigned int count_bytes)
                {
                    auto a = reader->ReadInt32();
                    auto b = reader->ReadInt32();
                    auto c = reader->ReadInt32();
                    auto d = reader->ReadInt32();
                });
            });
        });
    });
}
Во-первых, если запускать эту функцию сразу после предыдущей записи, то часто, почти всегда, вылетает exception: First-chance exception at 0x76CE2EEC in SculptArt.exe: Microsoft C++ exception: Platform::OutOfBoundsException ^ at memory location 0x02C8B238. HRESULT:0x8000000B Операция выполнила попытку доступа к данным вне допустимого диапазона. Как мне кажется, после записи я неправильно закрыл, а может и вообще не закрыл файл, а так как методы асинхронные, то exception вылетает не всегда, особенно, когда по шагам отлаживаю.

Во-вторых, в переменных b, c, d находятся очень большие числа, естественно не соответствуют желаемому диапазону от 0 до 9. Лишь переменная a = 0, как нужно. А если бы я писал данные типа byte, то все было бы нормально.
Как решить эти две проблемы? И вообще как правильно записывать писать/считывать из файла данные типа int, float, double и др.?
Спасибо за помощь.

Добавлено через 8 минут
забыл кое-что:
filename = "save1.txt"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 13:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно писать/считывать бинарные файлы в Windows Store Apps? (Программирование):

Как правильно добавить xml и java файлы в проект? - Программирование Android
Привет. Я новичок в Андроиде и Джава. Столкнулся с проблемой. Хочу создать дополнительный активити. Для этого, как я понимаю, надо создать...

Windows Phone/Runtime Apps: Clipboard - Windows Phone
Подскажите, может быть кто сталкивался с проблемой: Класс Clipboard существующий для Windows Phone Silverlight недоступен для Runtime...

Windows Phone/Runtime Apps: Виджет с Табами - Windows Phone
Добрый день! Подскажите виджет, реализующий табы, желательно вертикальные (для тех кто не понял о чем речь, см во вложении)...

Регистрация разработчика в Windows Store - Windows Phone
Ребят, возник такой вопрос, а какая карточка подойдет? ...

Публикация приложения в Windows Store - Windows Phone
Не получается добавить пакет программы на сайт microsoft. Открыл манифест и начал менять менять упаковку по требованиям, но ничего не...

Как в php правильно считывать rsa/pem файлы? - PHP
Добрый день, Следуя данной инструкции php.net/manual/ru/function.openssl-pkcs12-read.php , создал файл egov/exapmle.pem с таким...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2014, 13:37
Привет! Вот еще темы с ответами:

Есть знания с++, на каком движке писать игры для Windows store - C++
Есть знания с++ . На каком движке писать игры для Windows store. Какой язык подерживает данный язык. Что нужно мне изучить для...

Как считывать бинарные данные из файла с big-endian порядком? - Visual Basic .NET
Как считать данный из bin файла в котором данные(байты) записаны от старшего к младшему(т.е. в big-endian) сейчас я использую такой код...

Как открыть файл, чтоб не было проблем писать бинарные значения? - PHP
Привет народ!! ну вот растолкуйте в чем тут проблема? &lt;?php $var = 0xFF; var_dump ($var); // выводит: int(255) $h = fopen...

Как правильно считывать строки Excel - C#
Надо считать все заданные столбцы из таблицы Excel в dt, начиная с определенной строки Делаю в цикле по строкам, перебирая каждую ячейку ...


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

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

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