LINUX.ORG.RU

Не получается написать прогу


0

1

Задание
7.   Написать программу кодировки входного файла на основании кодового слова с возможностью декодирования (алгоритм сложения по модулю два).

Сама прога:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char*argv[])
{
	int n,f1,f2;
    	char szName;
    	int szPassword;
    	char i,s,szResult;
	if ((f1 = open(argv[1],O_RDONLY))<0)
	{
		printf("File not found\n");
		exit(1);
	}
	if ((f2 = open(argv[2],O_WRONLY | O_CREAT,0644))<0)
	{
            	printf("File not found\n");
	    	exit(1);
	}

	i=atoi(argv[3]);
	while (read(f1,&szName,1)>0)
   	{ 	
		
       		szResult = i ^ szName;
        	write(f2,&szResult,1);
	}
        
	lseek(f2, 0,  SEEK_END);

	 	while (read(f2,&szName,1)>0)
   	{ 	
		
       		szResult = i ^ szName;
        	write(f2,&szResult,1);
	}
	
	close(f1);
	close(f2);
	return(0);
}
Заранее спасибо.



Последнее исправление: zenum (всего исправлений: 2)

lseek(f2, 0, SEEK_END); while (read(f2,&szName,1)>0)

Интересно, а что вы хотите прочитать в конце файла?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

это я случайно. Не туда поставил,неопытность))).В этой программе ошибка он кодирует ненормально и следовательно декодирует так же.Объясните че к чему?

zenum
() автор топика
Ответ на: комментарий от zenum

Оператором % у вас никакого кодирования не получится ;) Представьте себе, задали вы число 10, следовательно, весь диапазон из 256 символов будет обрезан до 10. Выполняйте операцию «исключающего или», если хотите, чтобы процесс был обратимым.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от zenum

Советую на будущее, чтобы не напрягать жесткий диск либо использовать fopen/fread/fwrite, либо считывать и писать open/write большие блоки (т.е. считали блок, скажем, ~1Мб в оперативку, обработали, записали). Дальше, куда вы дели seek? Перемотать-то на начало файл f2 надо при декодировании? Да и писать декодированную информацию надо либо в f1, либо в какой-нибудь третий файл (или на стандартный вывод).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Zhbert
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char*argv[])
{
   int n,f1,f2;
   char szName;
   int szPassword;
   char i,s,szResult;
   if ((f1 = open(argv[1],O_RDONLY))<0)
   {
      printf("File not found\n");
      exit(1);
   }
   if ((f2 = open(argv[2],O_WRONLY | O_CREAT,0644))<0)
   {
   printf("File not found\n");
       exit(1);
   }

   i=atoi(argv[3]);
   unsigned int a = 0;
   while (read(f1,&szName,1)>0)
   {    
      
      szResult = i % szName;
   write(f2,&szResult,1);
   }
       while (read(f2,&szName,1)>0)
   {    
      
      szResult = i % szName;
   write(f2,&szResult,1);
   }
   
   close(f1);
   close(f2);
   return(0);
}

Вот так вот выглядеть будет.

Zhbert ★★★★★
()

В общем, должно получиться что-то вроде вот этого:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define ERR(...) 	{fprintf(stderr, __VA_ARGS__); exit(1);}
int main(int argc, char*argv[]){ 
	FILE *f_in, *f_out;
	unsigned char inp, outp, pass;
	int i;
	struct stat s_stat;
	if(argc < 4)
		ERR("Usage: %s <input file> <output file> num\n\twhere 1 < num < 255\n", argv[0]);
	if(stat(argv[1], &s_stat) != 0)
		ERR("File %s not found\n", argv[1]); 
	if(!S_ISREG(s_stat.st_mode))
		ERR("File %s is not a regular file\n", argv[1]);
	if(!(f_in = fopen(argv[1], "r+")))
		ERR("Can't open %s\n", argv[1]);
	if(!(f_out = fopen(argv[2], "w+")))
		ERR("Can't open %s\n", argv[2]);
	i = atoi(argv[3]);
	pass = (unsigned char) i;
	printf("pass: %d\n", pass);
	if(i<2 || i>254)
		ERR("Code must be in interval [2, 254]\n");
	while(fread(&inp, 1, 1, f_in) > 0){     
		outp = inp ^ pass;
		fwrite(&outp, 1, 1, f_out); 
	}
	fseek(f_out, 0,  SEEK_SET); 
	while (fread(&inp, 1, 1, f_out)>0){
		outp = inp ^ pass; 
		putchar(outp);
	}
	printf("\n");
	fclose(f_in); 
	fclose(f_out); 
} 

Eddy_Em ☆☆☆☆☆
()

Зачётная неделя... ну, вы понели.

LamerOk ★★★★★
()
// Избавляемся от такой goto практики
if ((f1 = open(argv[1],O_RDONLY))<0)
{ 
  printf("File not found\n"); 
  exit(1);
} 

В том числе - и в виде ERR-макроса, указанного выше

impfp
()
Ответ на: комментарий от Eddy_Em

Спасибо.Если бы ты жил в Омске, я бы тебе купил пивко.)))

zenum
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.