2010-03-18 63 views
3

我正在写一些代码,以便在for循环每次迭代运行将数据写入到一个文件中,这样的功能:如何使用c清除文件的内容?

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 */ 
    ... 
} 

我如何得到它,这样,当我运行程序它会在程序开始时删除文件内容,但在此之后它会将数据追加到文件中?我知道在fopen()中使用“w”标识符会打开一个空的新文件,但我希望能够在每次通过'writedata()'函数时将数据附加到文件中,因此使用“a”标识符。

回答

6

这是你应该怎么做的。这样你只需要打开一次文件,当你这样做的时候它会被截断。请注意,您必须更改您的函数原型(无论它在哪里)。

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 */ 
    ... 
} 
+0

+1显示如何在循环之前调用fopen – Jack 2010-03-18 17:59:34

+1

还要注意,系统调用open()也可以完成这项工作。我认为fopen在这里更合适。 – Jack 2010-03-18 18:00:25

0

也许是这样的:

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 *传递给函数。这样,它不必知道它是否附加到现有的文件。

3

为什么你一遍又一遍地打开同一个文件?

为什么不与w+模式打开它writedata功能外,文件指针传递给writedata这样你就可以/* do other stuff */呢?

+0

对不起,我是一个新手,如何将文件指针传递给writedata函数?我已经尝试过,但我无法弄清楚 – Eddy 2010-03-18 17:25:24

+0

好吧,我现在已经明白了,我不得不使用“w”而不是“w +”,否则我会遇到分段错误。 – Eddy 2010-03-18 17:36:19

+0

+1注意到一遍又一遍地打开一个文件是多么的疯狂,这是一个非常昂贵的操作。 – 2010-03-18 17:52:27

4

我不明白你为什么需要这种方式,但它似乎ftruncate() POSIX功能是你在找什么。

1

这种方式怎么样?与其他一些解决方案不太一样。

#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

怎么样这样:

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

那么打开文件进行写入和自动擦除。