Как очистить содержимое файла с помощью c? - PullRequest
3 голосов
/ 18 марта 2010

Я пишу некоторый код, чтобы на каждой итерации цикла for он выполнял функции, которые записывают данные в файл, например:

int main()
{
    int i;

    /* Write data to file 100 times */
    for(i = 0; i < 100; i++)    writedata();

    return 0;
}

void writedata()
{
    /* Create file for displaying output */
    FILE *data;
    data = fopen("output.dat", "a");

    /* do other stuff */
    ...
}

Как получить, чтобы при запуске программы она удаляла содержимое файла в начале программы, но после этого добавляла данные в файл? Я знаю, что использование идентификатора "w" в fopen() откроет новый пустой файл, но я хочу иметь возможность «добавлять» данные в файл каждый раз, когда он проходит через функцию writedata(), поэтому использование "a" идентификатор.

Ответы [ 6 ]

6 голосов
/ 18 марта 2010

Вот как вы должны это сделать. Таким образом, вам нужно открыть файл только один раз, и он будет обрезан, когда вы это сделаете. Обратите внимание, что вам также придется изменить прототип вашей функции (где бы он ни находился).

int main()
{
    int i;

    FILE *data;
    data = fopen("output.dat", "w");
    if(!data) {
         perror("Error opening file");
         return 1;
    }

    /* Write data to file 100 times */
    for(i = 0; i < 100; i++)    writedata(data);

    fclose(data);

    return 0;
}

void writedata(FILE *data)
{

    /* do other stuff */
    ...
}
4 голосов
/ 18 марта 2010

Я не понимаю, зачем вам это нужно, но кажется, ftruncate() Функция POSIX - это то, что вы ищете.

3 голосов
/ 18 марта 2010

Почему вы открываете один и тот же файл снова и снова?

Почему бы не открыть его вне функции writedata в режиме w+ и передать указатель файла на writedata, чтобы вы могли /* do other stuff */ с ним?

1 голос
/ 18 марта 2010

Как насчет этого? Не так аккуратно, как некоторые другие решения.

#include<stdio.h> 
static int t = 0;    
void writedata()
{
   FILE* data;
   if(t == 0) {
      data = fopen("output.dat", "w");
      t++;
   } else {
      data = fopen("output.dat", "a");
   }
} 

int main()
{
    int i;
    for(i = 0; i < 100; i++) writedata();
    return 0;
}
0 голосов
/ 09 марта 2014

Как насчет этого:

void clear_file(const char *filename)
{ 
    FILE *output = fopen(filename, "w");
    fclose(output);
}

Таким образом, файл открывается для записи и автоматически стирается.

0 голосов
/ 18 марта 2010

Возможно вот так:

static void writedata(int append);

int main()
{
    int i;

    /* Write data to file 100 times */
    for(i = 0; i < 100; i++) 
        writedata(i == 0);

    return 0;
}

static void writedata(int append)
{
    /* Create file for displaying output */
    FILE *data;
    data = fopen("output.dat", append ? "a" : "w");

    /* do other stuff */
    ...
}

Это просто передает флаг, который сообщает функции, должен ли он открыть файл для добавления или нет.

Лучшим решением было бы слегка реорганизовать код, просто открыть файл один раз перед циклом и передать FILE * в функцию. Таким образом, ему не нужно знать, добавляется ли он к существующему файлу или нет.

...