2010-03-18 8 views
3

J'écris un code de sorte qu'à chaque itération d'une boucle, il exécute une fonction qui écrit des données dans un fichier, comme celui-ci:Comment effacer le contenu d'un fichier en utilisant 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 */ 
    ... 
} 

Comment puis-je obtenir pour que quand je lance le programme il va supprimer le contenu du fichier au début du programme, mais après cela, il ajoutera des données dans le fichier? Je sais que l'utilisation de l'identifiant "w" dans fopen() va ouvrir un nouveau fichier vide, mais je veux pouvoir "ajouter" des données au fichier chaque fois qu'il passe par la fonction 'writedata()', d'où le utilisation de l'identifiant "a".

Répondre

6

Voici comment vous devriez vraiment le faire. De cette façon, vous avez seulement besoin d'ouvrir le fichier une fois, et il sera tronqué quand vous le faites. Notez que vous devrez aussi changer votre prototype de fonction (où que ce soit).

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 pour montrer comment appeler fopen avant la boucle – Jack

+1

Notez également qu'il y a un appel système open() qui effectue également le travail. Je pense que fopen est plus approprié ici. – Jack

0

Peut-être comme ceci:

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

Ceci passe simplement dans un drapeau qui indique la fonction si elle doit ouvrir le fichier pour append ou non.

Une meilleure solution serait de refactoriser légèrement le code, de simplement ouvrir le fichier une fois avant la boucle, et de passer le FILE * dans la fonction. De cette façon, il n'a pas besoin de savoir s'il est ajouté à un fichier existant ou non.

3

Pourquoi ouvrez-vous le même fichier encore et encore?

Pourquoi ne pas l'ouvrir en dehors de la fonction writedata avec le mode w+ et passer le pointeur de fichier à writedata vous pouvez donc /* do other stuff */ avec elle?

+0

Désolé je suis un peu un newb, comment puis-je passer le pointeur de fichier à la fonction writedata? Je l'ai essayé avant mais je ne pouvais pas le comprendre – Eddy

+0

Ok, je l'ai compris maintenant, je devais utiliser "w" pas "w +" sinon je reçois un défaut de segmentation. – Eddy

+0

+1 pour noter à quel point il est insensé d'ouvrir un fichier encore et encore, ce qui est une opération extrêmement coûteuse. –

4

Je ne comprends pas pourquoi vous en avez besoin de cette façon, mais il semble ftruncate() fonction POSIX est ce que vous cherchez.

1

Comment à propos de cette façon? Pas tout à fait aussi soigné que d'autres solutions.

#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

Que diriez-vous de cette façon:

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

Donc fichier est ouvert pour l'écriture et automatiquement effacé.

Questions connexes