Problemas con la creación de archivos en C

Iniciado por k-mm, 5 Julio 2017, 01:16 AM

0 Miembros y 1 Visitante están viendo este tema.

k-mm

Hola buenas, resulta que soy nueva en esto de la programación y estoy haciendo un código en donde ingreso una imagen con formato bmp y debería crearse una imagen auxiliar (una copia de la imagen original). Funciona excelente en linux, pero no me funciona en Windows (lo probé en CodeBlocks y en  Dev-C++). ¿A qué se debe esto? AYUDA POR FAVOR !

engel lex

sin ver el código, puede ser cualquier cosa...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

k-mm

#2
 Perdón por lo desordenado, pero estoy esperando que funcione para hacerlo con funciones y dejarlo mas corto. En la opción 2 se supone que tendría que copiar la imagen. (Hasta el momento solo funciona con imágenes BMP de 24 bits).



#include <stdio.h>
#include <stdlib.h>


typedef struct{
   char marc1;
   char marc2;
   int tamArchivo;
   short int reservado1;
   short int reservado2;
   int finalDatos;
}FILEHEADER;

typedef struct{
   unsigned int tamCabecera;
   unsigned int ancho;
   unsigned int alto;
   short int numPlanos;
   short int tamPunto;
   unsigned int compresion;
   unsigned int tamImagen;
   unsigned int resoHoriz;
   unsigned int resoVertic;
   unsigned int tamTablaColor;
   unsigned int contColorImport;
}INFOHEADER;

typedef struct {
   unsigned char azul;
   unsigned char rojo;
   unsigned char verde;
}PIXEL;

int main ()
{
   int opcion;
   printf ("\t\tESTEGANOGRAFIA\n\n");
   printf ("Menu:  \n\n");
   printf ("1. Calcular capacidad total de imagen.\n");
   printf ("2. Esteganografiar.\n");
   printf ("3. Decodificar.\n");
   printf ("4. Salir.");
   printf("\n\nIngrese una opcion: ");
   scanf ("%d", &opcion);

   FILEHEADER fh;
   INFOHEADER ih;
   PIXEL pix;
   FILE *fp;
   FILE *fp2;
   char archivo[30];
   int i,j;

   if(opcion==1){
       printf("\nIngrese nombre del archivo: ");
       fflush(stdin);
       scanf("%s", archivo);
       fp = fopen(archivo,"rb");

       while(fp==NULL){
           printf("\nEl archivo no ha sido encontrado.\n");
           fflush(stdin);
           printf("\nIngrese nombre del archivo: ");
           scanf("%s", archivo);
           fp = fopen(archivo,"rb");
       }
       fseek(fp,0,SEEK_SET);
       unsigned char marc1 = fread(&fh.marc1, 1, sizeof(FILEHEADER), fp);
       fseek(fp, 1, SEEK_SET);
       unsigned char marc2 = fread(&fh.marc2, 1, sizeof(FILEHEADER), fp);
       fseek(fp, 14, SEEK_SET);
       unsigned int tamCabecera = fread(&ih.tamCabecera, 4, 1, fp);
       fseek(fp, 18, SEEK_SET);
       unsigned int ancho = fread(&ih.ancho, 4, 1, fp);
       fseek(fp, 22, SEEK_SET);
       unsigned int alto = fread(&ih.alto, 4, 1, fp);
       fseek(fp, 28, SEEK_SET);
       short int tamPunto = fread(&ih.tamPunto, 2, 1, fp);

       if(fh.marc1=='B' && fh.marc2=='M' && ih.tamCabecera==40){
           if(ih.tamPunto==24){          //INICIO CALCULO CAPACIDAD
               unsigned long long totBytes=(ih.ancho*ih.alto)*3;
               printf("Capacidad total: %llu bytes\n", totBytes);
           }
           if(ih.tamPunto==16){
               unsigned long long totBytes=(ih.ancho*ih.alto)*2;
               printf("Capacidad total: %llu bytes\n", totBytes);
           }
           if(ih.tamPunto==32){
               int totBytes=(ih.ancho*ih.alto);
               printf("Capacidad total: %d bytes\n", totBytes)*4;
           }   //FIN CALCULO CAPACIDAD
       }
       else{
           while(fh.marc1!='B' || fh.marc2!='M' || ih.tamCabecera!=40){
               printf ("\nImagen no valida.\n");
               printf("\nIngrese nombre del archivo: ");
               scanf("%s", archivo);
               fp = fopen(archivo,"rb");

               while(fp==NULL){
                   printf("\nEl archivo no ha sido encontrado.\n");
                   fflush(stdin);
                   printf("\nIngrese nombre del archivo: ");
                   scanf("%s", archivo);
                   fp = fopen(archivo,"rb");
               }

               fseek(fp,0,SEEK_SET);
               unsigned char marc1 = fread(&fh.marc1, 1, sizeof(FILEHEADER), fp);
               fseek(fp, 1, SEEK_SET);
               unsigned char marc2 = fread(&fh.marc2, 1, sizeof(FILEHEADER), fp);
               fseek(fp, 14, SEEK_SET);
               unsigned int tamCabecera = fread(&ih.tamCabecera, 4, 1, fp);
               fseek(fp, 18, SEEK_SET);
               unsigned int ancho = fread(&ih.ancho, 4, 1, fp);
               fseek(fp, 22, SEEK_SET);
               unsigned int alto = fread(&ih.alto, 4, 1, fp);
               fseek(fp, 28, SEEK_SET);
               short int tamPunto = fread(&ih.tamPunto, 2, 1, fp);
           }

           if(ih.tamPunto==24){          //INICIO CALCULO CAPACIDAD
               unsigned long long totBytes=(ih.ancho*ih.alto)*3;
               printf("Capacidad total: %llu bytes\n", totBytes);
           }
           if(ih.tamPunto==16){
               unsigned long long totBytes=(ih.ancho*ih.alto)*2;
               printf("Capacidad total: %llu bytes\n", totBytes);
           }
           if(ih.tamPunto==32){
               int totBytes=(ih.ancho*ih.alto)*4;
               printf("Capacidad total: %d bytes\n", totBytes);
           }   //FIN CALCULO CAPACIDAD
       }

   }
   if(opcion==2){
       printf("\nIngrese nombre del archivo: ");
       fflush(stdin);
       scanf("%s", archivo);
       fp = fopen(archivo, "rb");
       fp2 = fopen("aux.bmp", "w+");

       while(fp==NULL){
           printf("\nEl archivo no ha sido encontrado.\n");
           fflush(stdin);
           printf("\nIngrese nombre del archivo: ");
           scanf("%s", archivo);
           fp = fopen(archivo,"rb");
           fp2 = fopen("aux.bmp", "w+");
       }

       fseek(fp,0,SEEK_SET);
       fread(&fh, sizeof(unsigned char), 14, fp);
       fseek(fp,14,SEEK_SET);
       fread(&ih,sizeof(unsigned char), 40,fp);
       unsigned int valor[ih.ancho][ih.alto];
       fseek(fp2, 0, SEEK_SET);
       fwrite(&fh, sizeof(unsigned char), 14, fp2);    //TENER FWRITE AQUI HACE QUE CREE AUX AUNQUE SEA UN ARCHIVO INVALIDO O NO EXISTA
       fseek(fp2, 14, SEEK_SET);
       fwrite(&ih, sizeof(unsigned int), 40, fp2);

       if(fh.marc1=='B' && fh.marc2=='M' && ih.tamCabecera==40){
           if(ih.tamPunto==24){
               unsigned long long totBytes=(ih.ancho*ih.alto)*3;
               for(i=0; i<ih.alto; i++){
                   for(j=0; j<ih.ancho; j++){
                       fseek(fp, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
                       fread(&pix, sizeof(char), sizeof(PIXEL), fp);
                       fseek(fp2, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
                       fwrite(&pix, sizeof(char), sizeof(PIXEL), fp2);
                   }
               }

           }
           if(ih.tamPunto==16){
               unsigned long long totBytes=(ih.ancho*ih.alto)*2;
           }
           if(ih.tamPunto==32){
               int totBytes=(ih.ancho*ih.alto)*4;
           }   //FIN CALCULO CAPACIDAD
       }
       else{
           while(fh.marc1!='B' || fh.marc2!='M' || ih.tamCabecera!=40){
               printf ("\nImagen no valida.\n");
               printf("\nIngrese nombre del archivo: ");
               scanf("%s", archivo);
               fp = fopen(archivo,"rb");
               fp2 = fopen("aux.bmp", "w+");

               while(fp==NULL){
                   printf("\nEl archivo no ha sido encontrado.\n");
                   fflush(stdin);
                   printf("\nIngrese nombre del archivo: ");
                   scanf("%s", archivo);
                   fp = fopen(archivo,"rb");
                   fp2 = fopen("aux.bmp", "w+");
               }

               fseek(fp,0,SEEK_SET);
               fread(&fh, sizeof(unsigned char), 14, fp);
               fseek(fp,14,SEEK_SET);
               fread(&ih,sizeof(unsigned char), 40,fp);
               unsigned int valor[ih.ancho][ih.alto];
               fseek(fp2, 0, SEEK_SET);
               fwrite(&fh, sizeof(unsigned char), 14, fp2);
               fseek(fp2, 14, SEEK_SET);
               fwrite(&ih, sizeof(unsigned int), 40, fp2);

               if(ih.tamPunto==24){
                   unsigned long long totBytes=(ih.ancho*ih.alto)*3;
                   for(i=0; i<ih.ancho; i++){
                       for(j=0; j<ih.alto; j++){
                           fseek(fp, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
                           fread(&pix, sizeof(char), sizeof(PIXEL), fp);
                           fseek(fp2, (fh.finalDatos+3*(j+ih.ancho*i)), SEEK_SET);
                           fwrite(&pix, sizeof(char), sizeof(PIXEL), fp2);
                       }
                   }

               }
               if(ih.tamPunto==16){
                   unsigned long long totBytes=(ih.ancho*ih.alto)*2;
               }
               if(ih.tamPunto==32){
                   int totBytes=(ih.ancho*ih.alto)*4;
               }
           }
       }


   }
return 0;
}



· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex