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

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

Войти
Регистрация
Восстановить пароль
 
Vl@disl@v
0 / 0 / 0
Регистрация: 17.07.2013
Сообщений: 9
16.02.2014, 13:37     Как правильно писать/считывать бинарные файлы в Windows Store Apps? #1
Здравствуйте. Раньше, до 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"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 13:37     Как правильно писать/считывать бинарные файлы в Windows Store Apps?
Посмотрите здесь:

Как правильно добавить xml и java файлы в проект? Android
Как выложить в app store
Как нужно писать заголовки?
Android Как писать приложения для Google Glass?
В какой среде лучше писать под Windows Phone? Windows Phone
Регистрация разработчика в Windows Store Windows Phone
Android Как правильно настроить Genymotion и где потом искать файлы базы данных?
Windows Phone/Runtime Apps: Виджет с Табами Windows Phone
Windows Phone Windows Phone/Runtime Apps: Clipboard
Как считывать текст с определённого элемента на сайте? Android
Windows Phone Публикация приложения в Windows Store
Как начать писать под iOS?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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