В C есть кроссплатформенный способ хранения того, что может содержать переменная для быстрой перезагрузки ее содержимого? - PullRequest
4 голосов
/ 04 сентября 2010

Идея состоит в том, что приложение может содержать структуру больших массивов, которые заполняются через медленную внешнюю библиотеку.Итак, что, если это можно легко сохранить в файле для быстрой ссылки, по крайней мере, после того, как он был запущен один раз?Если это невозможно сделать кросс-платформенным способом, легко ли это сделать локально «после первого запуска»?

Ответы [ 3 ]

3 голосов
/ 04 сентября 2010

зависит от способа заполнения структуры.если структура имеет фиксированный размер (то есть она не содержит динамически размещаемого указателя) и является автономной (она не содержит указателей на память вне самой структуры), то вы можете вывести структуру непосредственно в файл, используя стандартныйработа с файлом библиотеки.что-то по этому пути:

#include <stdio.h>

FILE *file;

file = fopen( "filename", "w" );
fwrite( &your_struct, sizeof(your_struct), 1, file )
fclose( file );

(примечание: проверка ошибок опущена для ясности и краткости)

перезагрузка выглядит примерно так:

file = fopen( "filename", "r" );
fread( &your_struct, sizeof(your_struct), 1, file );
fclose( file );

этот метод будет работать на всех платформах.

однако этот метод не является строго кроссплатформенным, поскольку результирующий файл не может быть перенесен между машинами с различным порядком байтов (например, старые Macintosh'ы использовали для хранения байтов, составляющих int, в другом порядке, чемкомпьютер IBM);Полученный файл может использоваться только на платформах той же архитектуры, что и компьютер, на котором был создан файл.

теперь, если структура не является автономной (содержит указатель, ссылающийся на память вне структуры) или использует динамическивыделенной памяти, тогда вам понадобится что-то более сложное ...


относительно проблемы с порядком байтов, стандартная реализация сокета BSD, которая существует почти на каждой платформе, определяет набор функций для преобразования из порядок сетевых байтов до порядок байтов хоста (и их обратный), что очень удобно, поскольку порядок байтов в сети строго кроссплатформенный.взгляните на htons() и ntohs(), htonl() и ntohl().к сожалению, вы должны вызывать эти функции для каждого поля структуры, что довольно громоздко, если структура большая.

0 голосов
/ 04 сентября 2010

возможно вы можете сохранить данные в XML-Format-File. Благодаря этому вы можете избежать проблем, сказанных Адрианом, и у вас также не возникнет проблем с кодовыми наборами символов для конкретных языков, и у вас даже будет возможность читать, записывать и обрабатывать данные на совершенно разных языках программирования

0 голосов
/ 04 сентября 2010

Endianness - одна из проблем, см. «Написание независимого от байтов кода в C» от ​​IBM: http://www.ibm.com/developerworks/aix/library/au-endianc/index.html?ca=drs-

Но вам также нужно будет позаботиться о «структуре заполнения и выравнивания», см. эту статью из C Linux Pro:

http: // clinuxpro.com/Cprogramming/structurepadding.php (извините, Stackoverflow запрещает мне использовать вторую ссылку, говоря, что это будет СПАМ ...)

Тогда, если вы будете осторожны с обоими проблемами, вы можете переносить данные переносимым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...