Как усечь файл в C?

(Другие Ответы работают слишком усердно. Все, что нужно, это UNIQUE и некоторый простой код SQL.)

Если у вас есть значения $ x и $ y для вставки в таблицу, тогда Обязательно поместите их в каноническом порядке:

INSERT INTO tbl (a, b)
    VALUES ( LEAST($x, $y),
             GREATEST($x, $y) )

И имейте

UNIQUE(a, b)   -- or, better yet, PRIMARY KEY(a,b)

Обратите внимание, что значения (1,2) или (2,1), единственные будет вставлена ​​строка (1,2)

Что нужно сделать, если вы попытаетесь вставить оба? Один войдет как (1,2); другой получит ошибку на INSERT. Вы можете игнорировать ошибку через INSERT IGNORE. Если есть другие столбцы, требующие настройки, рассмотрите возможность использования INSERT .. ON DUPLICATE KEY UPDATE ..

44
задан Jonathan Leffler 17 May 2009 в 00:46
поделиться

6 ответов

В системах Windows нет заголовка , но вы можете обрезать файл, используя

 _chsize( fileno(f), size);
23
ответ дан 26 November 2019 в 21:47
поделиться

Если вы хотите сохранить предыдущее содержимое файла до некоторой длины (длина больше нуля, как указано в других ответах), тогда POSIX предоставляет truncate () и ftruncate () для задания.

#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);

Имя указывает на основную цель - сокращение файла. Но если указанная длина больше предыдущей, файл увеличивается (нулевое заполнение) до нового размера. Обратите внимание, что ftruncate () работает с файловым дескриптором, а не с ФАЙЛОМ * ; вы можете использовать:

if (ftruncate(fileno(fp), new_length) != 0) ...error handling...

Однако вы должны знать, что смешивание файлового потока ( FILE * ) и файлового дескриптора ( int ) доступа к одному файлу может привести к путанице. - см. Комментарии по некоторым вопросам. Это должно быть крайней мерой.

Вполне вероятно, что для ваших целей усечение при открытии - это все, что вам нужно, и для этого будет достаточно параметров, предоставленных другими.


Для Windows существует функция SetEndOfFile () и связанная с ней функция SetFileValidData () функция, которая может выполнять аналогичную работу, но с использованием другого интерфейса. По сути, вы ищете то место, где хотите установить конец файла, а затем вызываете функцию.

Также есть функция _chsize () , как описано в ответе от ] sofr .

71
ответ дан 26 November 2019 в 21:47
поделиться

Это функция вашей операционной системы. Стандартный способ POSIX сделать это:

open("file", O_TRUNC | O_WRONLY);
13
ответ дан 26 November 2019 в 21:47
поделиться

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

Обрезать весь файл:

FILE *file = fopen("filename.txt", "w"); //automatically clears the entire file for you.

Обрезать часть файла:

FILE *inFile("filename.txt", "r");
//read in the data you want to keep
fclose(inFile);
FILE *outFile("filename.txt", "w");
//output back the data you want to keep into the file, or what you want to output.
3
ответ дан 26 November 2019 в 21:47
поделиться

Если это должно работать под какой-либо разновидностью UNIX, эти API-интерфейсы должны быть доступны:

   #include <unistd.h>
   #include <sys/types.h>

   int truncate(const char *path, off_t length);
   int ftruncate(int fd, off_t length);

Согласно "man truncate" в моем Linux-компьютере, они соответствуют POSIX. Обратите внимание, что эти вызовы фактически увеличат размер файла (!), Если вы передадите длину, превышающую текущую.

8
ответ дан 26 November 2019 в 21:47
поделиться

А, вы редактировали свое сообщение, вы используете C. Когда вы открываете файл, откройте его с помощью режим "w +" будет выглядеть так, и он будет обрезан, готов к записи:

FILE* f = fopen("C:\\gabehabe.txt", "w+");
fclose(file);

Чтобы обрезать файл в C ++, вы можете просто создать объект ofstream для файла, используя ios_base :: trunc в качестве файлового режима для его усечения, например:

ofstream x("C:\\gabehabe.txt", ios_base::trunc);
2
ответ дан 26 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

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