C - l'écriture de la sortie vers un fichier
EDIT:
void print(const int *v, const int size) {
FILE *fpIn;
fpIn = fopen("char-array.txt", "a");
int i;
if (v != 0) {
for (i = 0; i < size; i++) {
printf("%d", (int)v[i]);
fprintf(fpIn, "%d\n", (int)v[i]);
}
perm_count++;
printf("\n");
}
fclose(fpIn);
}
Je suppose que c'est une question relativement simple 🙂
Fondamentalement, le programme utilise un algorithme de permutation et de l'impression, la sortie standard de la console. Je veux aussi écrire le contenu d'un fichier via fprintf je suppose. Bien que je ne peux pas sembler obtenir travail. Il se contente d'afficher des caractères illisibles dans la première ligne du fichier texte et rien de plus !
Je vais coller le code ci-dessous, et l'aide est très apprécié ! L'écriture de fichier de code se trouve au sein de la fonction d'impression.
Merci,
T.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf("%2.3f seconds used by the processor.", ((double)stopm- startm)/CLOCKS_PER_SEC);
int perm_count = 0;
void print(const int *v, const int size) {
FILE *fpIn;
fpIn = fopen("char-array.txt", "wb");
int i;
if (v != 0) {
for (i = 0; i < size; i++) {
printf("%d", (char)v[i]);
fprintf(fpIn, "%d", v[i]);
fprintf(fpIn, "\n");
}
perm_count++;
printf("\n");
}
}
void permute(int *v, const int start, const int n) {
int i;
if (start == n-1) {
print(v, n);
}
else {
for (i = start; i < n; i++) {
int tmp = v[i];
v[i] = v[start];
v[start] = tmp;
permute(v, start+1, n);
v[start] = v[i];
v[i] = tmp;
}
}
}
int main() {
int i, x;
printf("Please enter the number of terms: ");
scanf("%d", &x);
int arr[x];
printf("Please enter the terms: ");
for(i = 0; i < x; i++)
scanf("%d", &arr[i]);
START
permute(arr, 0, sizeof(arr)/sizeof(int));
STOP
printf("Permutation Count: %d\n", perm_count);
PRINTTIME
return 0;
}
- Je voudrais suggérer que la dépendance sur les macros pour les tâches qui peuvent être facilement traités par les fonctions de la place.
- +1 @sarnold. Votre avenir débogage auto vous remercie.
Vous devez vous connecter pour publier un commentaire.
1. Incorrect modes d'accès à fopen appel
Vous ouvrez votre fichier en tant que fichier binaire:
fopen("char-array.txt", "wb");
. Ne mettez pasb
à cette chaîne de caractères contenant modes d'accès si vous vous apprêtez à écrire formaté les chaînes. Et puisque vous voulez probablement ajouter de nouvelles données à la fin du fichier au lieu de overwritting, l'utilisation dea
au lieu dew
:2. L'écriture de la mémoire tampon de sortie, pas directement dans le fichier
Lorsque vous utilisez des fonctions comme fprintf, vous n'avez pas d'écrire directement dans le fichier, mais pour le tampon de sortie. Vous devez utiliser fflush pour écrire des données à partir de la sortie de la mémoire tampon dans le fichier, ou vous pouvez simplement fermer votre fichier à l'aide de fclose fonction qui nettoie ce tampon automatiquement.
Il suffit d'ajouter cette ligne:
à la fin de
print
fonction.3. Mise en forme incorrecte de la sortie
Vous ne devraient pas jeter
int
àchar
. Il va tronquer les chiffres de votre activité. Et vous avez égalementfprintf(fpIn, "\n");
dans le mauvais champ, je suppose. Il pourrait ressembler à ceci:you don't write directly to the file but to the output buffer
et comment le faire? Merci!fprintf
appel. Ce que vous écrivez dans un fichier est effectivement écrit une fois que le tampon est vidé (par exemple lorsque le fichier est fermé en appelantfclose
).Ne perdez pas votre temps à faire de la programmation, vous n'avez pas à, l'utilisation de
fprintf
est sympa, mais depuis tout ce que vous voulez faire est d'imprimer de la sortie, vous pouvez simplement imprimer des choses dans le fichier directement en utilisant UNIX commandes intégrées. Dire que votre programme est appeléwirteoutput
puis tout ce que vous avez à faire est de passer la commande suivante lors de l'appel de la coquillewriteoutput > file.txt
. Tout ce que vous avez à utiliser serait leprintf
fonction.Si vous êtes curieux à ce sujet, c'est un vieux de la fonction et vous pouvez trouver une description détaillée dans le document original Le Système d'Exploitation UNIX. Regardez la section intitulée Standard I/O.
Vous n'avez pas jeté un
char
(à partir d'unint
) quand vous avez écrit vers le fichier que vous avez fait avec l'écran d'affichage. Le tableau suivant donne les mêmes chiffres dans le fichier que vous voyez à l'écran: