Усеченный файл [дубликат]

Поскольку вам нужно, чтобы значение было доступно во время компиляции, практически единственный способ его решить, на мой взгляд, это рекурсивные шаблоны. Однако тот факт, что вам нужно, чтобы указанный шаблон делал разные вещи, основанный на подписи переданного значения, усложняет ситуацию. Первое, что пришло бы в голову, это написать такой рекурсивный шаблон:

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;
    };

Live Demo [ 112].

12
задан Jonathan Leffler 25 February 2009 в 05:55
поделиться

4 ответа

SetEndOfFile ()

Получите дескриптор в файл с доступом для записи, установите указатель файла, затем назовите SetEndOfFile ().

- Adam

17
ответ дан 2 December 2019 в 05:16
поделиться

Если Вы хотите усечь файл для обнуления размера, Вы можете 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, такого как передать/переименовать решение выше.

5
ответ дан 2 December 2019 в 05:16
поделиться

Если Вы просто fopen() файл с "w" аргумент, это будет усеченным.

http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html

2
ответ дан 2 December 2019 в 05:16
поделиться

Как упомянуто уже, можно использовать 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.

1
ответ дан 2 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: