2010-03-18 59 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); 
} 

那麼打開文件進行寫入和自動擦除。