J'écris un programme qui prend en charge deux fichiers PNM P6 en double, place la mémoire du premier fichier dans un tampon, crée une ligne diagonale jaune et écrit le résultat dans le second fichier. Lorsque je l'exécute, le fichier de sortie est corrompu et ne peut pas être affiché. J'ai remarqué en regardant la sortie qui il manque les trois lignes qui devraient être en haut:Problèmes d'écriture PNM P6
P6
1786 1344
255
Je ne sais pas comment faire en sorte que ces lignes programme restent dans le code - je ne peux pas pourquoi ils sont même écrasés en premier lieu.
Lorsque j'ajoute manuellement ces lignes à la sortie, le fichier n'est plus corrompu. Cependant, aucune ligne diagonale jaune n'apparaît. Est-ce que cela fait partie du même problème, ou y a-t-il autre chose que je devrais envisager de corriger?
Mon code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
unsigned char red, green, blue;
} iPixel;
typedef struct
{
int x, y;
iPixel *data;
} Image;
Image *
ReadImage(char *filename)
{
FILE *f = fopen(filename, "rb");
Image *img = NULL;
char magicNum[128];
int width, height, maxval;
if (f == NULL)
{
fprintf(stderr, "Unable to open file %s\n", filename);
return NULL;
}
fscanf(f, "%s\n%d %d\n%d\n", magicNum, &width, &height, &maxval);
/*
printf("Magic num = %s width = %d, height = %d, maxval = %d\n",
magicNum, width, height, maxval)
;
*/
if (strcmp(magicNum, "P6") != 0)
{
fprintf(stderr, "Unable to read from file %s, because it is not a PNM file of type P6\n", filename);
return NULL;
}
img = (Image *) malloc(sizeof(Image));
img -> x = width;
img -> y = height;
img -> data = (iPixel*) malloc(img -> x * img -> y * sizeof(iPixel));
fread(img -> data, sizeof(iPixel), width*height, f);
fclose(f);
return img;
}
void WriteImage(Image *img, char *filename)
{
FILE *f = fopen(filename, "wb");
fwrite(img->data, sizeof(iPixel), img-> x * img-> y, f);
fclose(f);
}
Image *
YellowDiagonal(Image *input)
{
int i, j;
for (i = 0; i < input->x; i++)
{
for (j=0; j < input->y; j++)
{
if (i==j)
{
input->data[i].red=255;
input->data[i].green=255;
input->data[i].blue=0;
}
}
}
return input;
}
int main(int argc, char *argv[])
{
if (argc != 3)
{
fprintf(stderr, "Usage: ./3A_c.c <input image file> <output image file>\n");
exit(EXIT_FAILURE);
}
Image *img;
img = ReadImage(argv[1]);
fprintf(stderr, "Read.\n");
YellowDiagonal(img);
fprintf(stderr, "Diagonal line.\n");
WriteImage(img, argv[2]);
fprintf(stderr, "Write.\n");
}
ouverture d'un fichier nouveau pour la sortie efface son co actuelle ntents. Donc, avant d'écrire vos données, assurez-vous d'écrire ces lignes aussi bien.(Préféré sur l'alternative, qui est ouvert pour * mise à jour *, 'fseek' à la position correcte, et en écrivant vos nouvelles données là.) – usr2564301
Donc quelque chose comme ça? ' vide WriteImage (Image * img, char * nom_fichier) { \t FICHIER * f = fopen (nomfichier," wb "); Fwrite (img-> magicNum, 1, sizeof (char), f); Fwrite (img-> x, 1, sizeof (int), f); Fwrite (img-> y, 1, sizeof (int), f) \t; Fwrite (img-> maxval, 1, sizeof (int), f) \t fwrite (img-> données, taille de (iPixel), img-> x * img-> y, f); \t fclose (f); } ' – user3626715
Absolument pas. Essayez-le et inspectez le fichier! Vous écrivez * binary * où vous devez utiliser ASCII, selon les spécifications (et le fichier d'entrée). – usr2564301