2010-07-16 7 views
1

J'utilise fopen pour écrire dans un fichier binaire et utiliser la bibliothèque cstdio (stdio.h) en raison d'un code existant et il doit être compatible avec plusieurs plates-formes sous Windows et Linux.Remplacer le fichier en utilisant le mode ajout pour fopen

Pour le prototype, FILE * fopen (const char * filename, const char * mode);, j'utilise const char * mode = "ab", qui sera ajouté à un fichier binaire. Les opérations d'écriture ajoutent des données à la fin du fichier. Le fichier est créé s'il n'existe pas.

J'ai un nombre N de fichiers d'entrée où je traite des données et écris dans un fichier de sortie pour chaque type, où j'ai M types. Je traite un fichier d'entrée et écris les données dans chaque fichier de sortie correspondant. Je vais ensuite fermer ce fichier d'entrée et ouvrir (i + 1) e, et répéter le processus en ajoutant les données du fichier d'entrée dans les fichiers de sortie.

Si un fichier de sortie existe au début sur l'exécutable, je le veux supprimé. S'il existe et que je ne le supprime pas, alors quand j'utilise le mode "wb", il va juste ajouter des données au fichier de sortie, ce qui entraînera une duplication que je ne veux pas. Je suis ouvert à une solution de boost et je tiens à maintenir des normes mieux possible (éviter Posix si possible)

fopen C++ reference

+2

tenir, vous ou ne vous voulez pas remplacer? voulez-vous ajouter ce qu'il y a? Essayez d'être plus clair sur ce que vous aimeriez faire dans les cas "existe déjà" et "n'existe pas déjà" ... – eruciform

+2

Essayez de clarifier votre objectif plus clairement, je ne peux pas vraiment dire de votre message et code si vous voulez écraser (supprimer) des fichiers existants ou éviter cela. En outre, votre code n'a pas beaucoup de sens, car l'ouverture d'un fichier existant en mode écriture le supprimera. – schnaader

Répondre

3

Voici une façon

char* infile[N] = //input names 
char* outfile[M] = //output names 

int i, j; 
for (i = 0; i < N; i++){ 
    //process input 
    char* mode = "ab"; 
    if (i == 0) mode = "wb"; 
    for (j = 0; j < M; j++){ 
    FILE* f = fopen(outfile[j], mode); 
    //write to file 
    fclose(f); 
    } 
} 

Le mode "w" devrait remplacer le fichier. C'est un mode "a" qui évitera de supprimer un fichier qui existe déjà.

EDIT: Vous pouvez également remove (const char * filename) si vous souhaitez supprimer les fichiers au début de l'exécution. Si c'est le cas, vous n'avez jamais besoin d'utiliser le mode "wb".

1

Si vous voulez écraser plutôt que ajouter, pourquoi ne pas simplement utiliser le mode « wb "? "w" écrase le fichier lors de l'écriture.

+3

Peut-être qu'il veut détruire les données d'origine, mais alors être en mode ajout si même si le code fseek, toutes les écritures vont encore se terminer. –

+0

@Klatchko ... Frapper le clou sur la tête – Elpezmuerto

2

Une possibilité serait d'utiliser open (_open pour Windows) pour créer le descripteur de fichier approprié, puis utiliser fdopen (_fdopen pour Windows) pour créer une poignée stdio hors de lui. Vous aurez besoin d'un peu de magie préprocesseur pour gérer le fait que les noms ne sont pas exactement les mêmes dans Linux et Windows:

// Allow us to use Posix compatible names on Windows 
#ifdef WINDOWS 
#define open  _open 
#define O_CREAT _O_CREAT 
#define O_TRUNC _O_TRUNC 
#define O_APEND _O_APPEND 
#define S_IREAD _S_IREAD 
#define S_IWRITE _S_IWRITE 
#define fdopen _fdopen 
#endif 

int fd = open(filename, O_CREAT | O_TRUNC | O_APPEND, S_IREAD | S_IWRITE); 
FILE *fp = fdopen(fd, "a"); 
Questions connexes