Поскольку вам нужно, чтобы значение было доступно во время компиляции, практически единственный способ его решить, на мой взгляд, это рекурсивные шаблоны. Однако тот факт, что вам нужно, чтобы указанный шаблон делал разные вещи, основанный на подписи переданного значения, усложняет ситуацию. Первое, что пришло бы в голову, это написать такой рекурсивный шаблон:
template
struct DoubleValue
{
static constexpr double value = (exp < 0
? DoubleValue::value / 10
: 10 * DoubleValue::value);
};
// Default case
template <>
struct DoubleValue<0>
{
static constexpr double value = 1;
};
Однако такое решение не будет работать, потому что обе ветви троичного выражения будут нуждаться должны быть решены, и это всегда приведет к бесконечной рекурсии, поскольку одна из ветвей не будет стремиться к 0. Затем SFINAE пришло на ум:
// Base case.
template
struct DoubleValue
{
};
// Case when exp is positive
template
struct DoubleValue 0)>::type>
{
static constexpr double value = 10 * DoubleValue::value;
};
// Case when exp is negative
template
struct DoubleValue::type>
{
static constexpr double value = DoubleValue::value / 10;
};
// Default case.
template <>
struct DoubleValue<0>
{
static constexpr double value = 1;
};
Получите дескриптор в файл с доступом для записи, установите указатель файла, затем назовите SetEndOfFile ().
- Adam
Если Вы хотите усечь файл для обнуления размера, Вы можете fopen
с "w"
флаг:
FILE *fh = fopen("file.txt","w");
if (fh != NULL) fclose(fh);
Для усечения к определенному размеру в стандарте C, можно сделать это с передать/переименовать решением, чем-то как:
FILE *finp = fopen ("inp.txt", "rb"); // should check for NULLs
FILE *fout = fopen ("out.txt", "wb");
size_t sz = 100000; // 100,000 bytes
char *buff = malloc (sz); // should check for NULL
sz = fread (buff, 1, sz, fin); // should check for errors
fwrite (buff, 1, sz, fout);
free (buff);
fclose (fin);
fclose (fout);
rename ("out.txt", "inp.txt); // should check for error
Конечно, если у Вас есть доступ к заголовкам Win32 и библиотекам (и я полагаю, что MinGW дает Вам это), можно использовать SetEndOfFile()
, так как это делает это на месте, вместо того, чтобы иметь необходимость создать новый файл и затем переименовать его.
Это означает использовать Windows основанный на дескрипторе файловый ввод-вывод, а не C FILE*
- базирующийся, но, если Вы ограничиваете себя Windows так или иначе, который не может иметь значения. Если Вы захотите мобильность, с другой стороны, то Вам будет нужно решение на основе стандарта C, такого как передать/переименовать решение выше.
Если Вы просто fopen()
файл с "w"
аргумент, это будет усеченным.
http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html
Как упомянуто уже, можно использовать fopen () с флагом "w" как:
FILE *f = fopen("file.txt", "w");
Кроме того, если Вам уже открыли файл, можно использовать функцию freopen (), снова с флагом "w":
FILE *f = fopen("file.txt", "r"); //initial fopen() call
...
f = freopen("file.txt", "w", f); //reopens "file.txt" and truncates it
http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html
Править: После наблюдения Вы отредактировали свой OP, я не повторно отправлю то, что уже поместили Мир и Adam Davis. Кроме того, я буду подтверждать, какой сказанный Мир, что MinGW действительно предоставляет Вам доступ к заголовкам Win32.