Перегрузка функции c ++, заставляющая fwrite / fread работать как версии PHP - PullRequest
0 голосов
/ 06 июня 2010

Я привык к порядку параметров fwrite / fread в PHP и хочу сделать их такими же в C ++ тоже.

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

Я полный нуб на C ++, это то, что я сделал до сих пор: Редактировать: исправлено std :: string & buf

size_t fwrite(FILE *fp, const std::string &buf, const size_t len = SIZE_MAX){
    if(len == SIZE_MAX){
        return fwrite(buf.c_str(), 1, buf.length(), fp);
    }else{
        return fwrite(buf.c_str(), 1, len, fp);
    }
}

size_t fwrite(FILE *fp, const void *buf, const size_t len = SIZE_MAX){
    if(len == SIZE_MAX){
        return fwrite((const char *)buf, 1, strlen((const char *)buf), fp);
    }else{
        return fwrite(buf, 1, len, fp);
    }
}

Должно ли это работать нормально? И как это сделать, если я хочу сделать это как можно лучше?

Ответы [ 2 ]

2 голосов
/ 06 июня 2010

Если вы хотите записать файл наилучшим образом, вы должны использовать std :: iostreams. Решение проблемы длины буфера вручную - это рецепт проблем.

Кроме того, верхняя перегрузка должна принимать const std :: string &, а не const std :: string.

Однако я не вижу никаких реальных ошибок.

1 голос
/ 06 июня 2010

fwrite / fread не очень хорошо работают с объектами; так как @DeadMG говорит, что вам будет лучше с потоками.

что-то вроде:

cout << str << endl;

Это намного более ОО-способ ведения дел - вы можете перегрузить операторов внутри объектов, чтобы удовлетворить различные требования каждого отдельного объекта.

Это неправильная перегрузка функций IMO. Во всяком случае, эти функции должны быть методами внутри объекта.

...