Я предполагаю, что ваш файл содержит байтовое представление массива. Если это так, то для имитации c поведения вашего кода Objective- C с использованием только C ++ (единственное, что делает этот C ++, - это reinterpret_cast<>
, в противном случае это просто C), вы можно использовать следующий код. Я не добавлял никаких проверок ошибок, но оставил некоторые комментарии, в которых вы, возможно, захотите выполнить некоторые.
float tab[dim1][dim2][dim3];
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef dataTabURL = CFBundleCopyResourceURL(mainBundle, CFSTR("pathOfMyTab"), NULL, NULL);
CFReadStreamRef stream = CFReadStreamCreateWithFile(NULL, dataTabURL); // check for NULL return value
CFReadStreamOpen(stream); // check for errors here
CFReadStreamRead(stream, reinterpret_cast<UInt8 *>(tab), sizeof tab); // check that this function returns the number of bytes you were expecting (sizeof tab)
CFReadStreamClose(stream);
// we own "stream" and "dataTabURL" because we obtained these through functions
// with "create" in the name, therefore we must relinquish ownership with CFRelease
CFRelease(stream);
CFRelease(dataTabURL); // ditto
Если у вас уже есть путь, доступный в std::string
, вы можете использовать следующий код C ++ чтобы мими c поведение вашего кода Objective- C:
// make sure to include this header
#include <fstream>
// ... then elsewhere in your .cpp file ...
float tab[dim1][dim2][dim3];
std::string path = "path/to/mytab"; // obtain from somewhere
std::ifstream input(path, std::ios::binary); // check that the file was successfully opened
input.read(reinterpret_cast<char *>(tab), sizeof tab); // check that input.gcount() is the number of bytes you expected
Я считаю, что в этом случае мы должны использовать reinterpret_cast<>
, потому что файл содержит фактическое представление массива (при условии, что это был ранее записан в файл аналогичным образом).
Вы можете использовать гибридный подход, если у вас есть CFURLRef
, содержащий путь к ресурсу, вы можете получить представление URL-адреса в файловой системе, используя эта функция (предоставляющая выходной буфер подходящего размера для хранения результата), и оттуда вы сможете передать это в один из конструкторов std::ifstream
(хотя вам может потребоваться приведение к соответствующий тип).
C ++ не поддерживает массивы переменной длины (размер массивов должен быть известен во время компиляции). Стандартной библиотекой также нет типа матрицы, поэтому, если размеры вашей таблицы меняются во время выполнения, вам понадобится совершенно отдельный подход к тому, который был в моем ответе. Вы можете рассмотреть возможность сериализации вывода из Objective- C (используя, например, JSON или другой формат), чтобы размеры матрицы также записывались в вывод, что упрощает синтаксический анализ файла на C ++.