Je dois faire un programme qui prend des données de chaîne d'un fichier et copier chaque troisième caractère de celui-ci dans un autre fichier.
Je ne suis pas sûr que je le fais bien. L'idée que j'ai obtenue est de créer d'abord un tableau où je vais stocker des données originales à partir de fichier1, puis en utilisant la boucle "pour", je modifierai les données et stockerez-la dans le deuxième tableau:
(par exemple pour (i = 0; i #include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define BUFFER_SIZE 50
int main(int argc, char *argv[]) {
char buffer[BUFFER_SIZE];
char modified[BUFFER_SIZE];
int input_fd, output_fd;
ssize_t ret_in, ret_out;
if(argc !=3 || strcmp(argv[1], "--help") == 0)
{
printf("Usage: %s file_origin file_destination\n", argv[0]);
return 2;
}
input_fd = open(argv[1], O_RDONLY);
if(input_fd == -1)
{
perror("There is no such file");
return 2;
}
out_fd = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0644);
if(output_fd == -1)
{
perror("create");
return 3;
}
3 Réponses :
Si vous n'avez pas besoin de CIN ni de cout, je suggérerais ce qui suit (je supposais que les chaînes sont terminées par des nouvelles lignes et que celles-ci devraient être préservées dans la sortie et que compter le 3ème caractère commence à nouveau à chaque ligne de lecture):
FILE *f1=fopen("_infile.txt","rt");
FILE *f2=fopen("_outfuile.txt","wt");
char buffer[MAXBUFLEN];
while (!feof(f1)) {
if (fgets(buffer,MAXBUFLEN,f1)>0) {
for(int i=2;i<strlen(buffer);i+=3) {
fprintf(f2,"%c",buffer[i]);
}
fprintf(f2,"\n");
} else break;
}
fclose(f1);
fclose(f2);
Quelle est la pertinence de CIN code> ou COUT code> à une question C qui mentionne non plus?
Notez que tandis que (! Feof (fichier)) code> est toujours faux - bien que votre code soit un peu plus contraire auquel le plus. Vous vérifiez le fgets () code> appel, qui est l'étape habituellement négligée, mais vous n'avez vraiment pas besoin du si code> avec break code>; Vous devez simplement utiliser tandis que (fgets (tampon, taille de taille de (tampon), F1)! = 0) {...} code>. En utilisant feof () code> est presque toujours inutile et non pertinent; C'est ici aussi.
@Jonathan Leffler: Cin et Cout sont ce qui est venu d'abord à mon esprit lors de la lecture "Stream My Data". Votre code est plus simple et je conviens que l'utilisation de Feof n'est pas nécessaire, mais ce n'est pas faux.
Bienvenue à cela. Lors de la réponse aux questions C, ne mentionnez pas de concepts aléatoires C ++ - c'est négligents et potentiellement déroutants. J'ai dit que votre utilisation de Feof () code> est moins fausse que la plupart - cela fonctionnera en fait correctement, comme vous le demandez. Mais il s'agit simplement de codage gaspillé, en utilisant 2 lignes supplémentaires en raison de la manière dont vous avez formaté le code - il s'agirait de 4 ou 5 lignes dans de nombreux styles. Et le test ! Feof () code> échouera car votre boucle se ferme via la pause code> avant que le test soit exécuté à l'heure à laquelle il échouerait. Il n'échouera pas avant de tenter de lire la première ligne d'un fichier vide, par exemple.
Bonjour, la chose est que je dois le faire non tamponnée
Bienvenue sur Stackoverflow! P>
Compte tenu de la description exacte de votre affectation, je n'utiliserais pas de tampon; Vous pouvez simplement lire dans le fichier d'entrée un octet à la fois et écrivez tous les troisièmes octets dans le fichier de sortie. Cela évite toute augmentation de la gestion de la mémoire tampon. P>
Mais, si vous lisez à partir du fichier d'entrée dans un tampon, vous n'avez pas besoin de modifier ce tampon de quelque manière que ce soit, vous n'avez pas besoin d'un deuxième tampon. Après avoir lu toutes les données, simplement itérer via le tampon d'entrée, émettant tous les tiers octets vers le fichier de sortie. P>
Mais, si vous voulez / besoin de réutiliser la sortie d'une manière ou d'une autre, vous pouvez simplement remplir un deuxième tampon à partir du tampon d'entrée de la même manière (boucle sur le tampon d'entrée, sauter deux octets chaque itération), puis écrivez ce deuxième tampon au fichier de sortie. (De cette façon, vous avez toujours la même sortie dans ce deuxième tampon et vous pouvez la réutiliser d'une certaine manière.) P>
L'approche que vous prenez dictera les meilleures fonctions à utiliser. Je vois que vous savez déjà sur Veuillez noter que pour les approches utilisant des tampons, vous devez faire très attention à la taille de vos tampons par rapport à la taille du fichier d'entrée. Il y a beaucoup de pièges ici. S'il s'agit d'une affectation pour une classe de quelque sorte, ces considérations peuvent apparaître dans des cours / missions ultérieures, et peut-être que c'est trop à prendre à l'époque. Mais il n'est jamais trop tôt pour commencer à penser à ce que vous faites et que vous ne connaissez pas la contribution de votre programme auront besoin de gérer. P> ouvert () code>. Lire sur Lire () code>, écrire () code> et ferme () code>, mais lisez également sur fopen () code >, fgetc.) code>, fgets () code>, Fread () code>, fgead (code> fgead () code> et fclose () code>. Il y a beaucoup pour vous d'apprendre de lire ces différentes fonctions, de la façon dont ils sont similaires, comment ils diffèrent les uns des autres et les avantages et les inconvénients de chacun. Lire à propos d'eux vous mènera à vous en apprendre davantage sur les autres opérations de fichiers connexes (comme la recherche, le rembobinage, etc.), qui vous servira bien que vous en apprendrez plus sur C et la programmation en général. P>
Cela lira le fichier d'entrée et réimprimera chaque tiers de caractère à la sortie. Vous pouvez l'adapter à votre situation.
#include <stdio.h>
#include <stdlib.h>
int main()
{
size_t i; // index
int c; // char read
FILE *FIN, *FOUT; // file streams
if ((FIN = fopen("in.txt", "rb")) == NULL) {
printf("Error opening input file.\n Exiting.\n");
exit(1);
}
if ((FOUT = fopen("out.txt", "wb")) == NULL) {
printf("Error opening output file.\n Exiting.\n");
exit(1);
}
// read input and reprint every third character
for(i=0;;i++)
{
c = fgetc(FIN); // read byte
if(c == EOF)
{
break; // reached end of file (input), leave loop
}
if((i%3)==2) // get every third character by modulo(i)
{
fputc(c, FOUT); // write output
}
}
fclose(FIN);
fclose(FOUT);
return 0;
}
Dans votre commentaire sur la réponse de Marc M, vous dites que vous devez le faire sous une manière non tamponnée; C'est un peu déroutant car votre propre code utilise un tampon; Mais, pour une approche non tamponnée, voir la première suggestion de ma réponse: "Il suffit de lire à partir du fichier d'entrée un octet à la fois et d'écrire tous les tiers octets dans le fichier de sortie"; Mais pour faire cela, vous voulez probablement envisager divers appels de fonction d'E / S; J'ai énuméré un bon ensemble de ceux pour commencer dans ma réponse; Lisez sur ceux et vous apprendrez beaucoup sur la façon dont vous pouvez accomplir cela