• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Работа С Файлами

  • Автор темы kingl
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

kingl

Составить программу, реализующую функции указанного ниже меню. Выполнить функциональное разбиение программного кода.

Меню программы:
1 – Сформировать с клавиатуры строку и записать в файл (строка может содержать пробелы);
2 – Считать строку из файла и распечатать;
3 – Зашифровать строку и записать в файл;
4 – Расшифровать строку и записать в файл;
5 – Выход.

Четные и нечетные символы меняются местами.

Вот что у меня получилось, все работает, но если сразу допустим 4 пункт меню выбрать, пропуская первый, то есть ничего не записывая в файл - виснет, а должно выводить ошибку. и функция "default" тоже не работает. Вот мой код:
#include <io.h>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <windows.h>
#include <ShellAPI.h>

void f(char*, char*);

void main()
{
char Str1[100] = "";
char Str2;
unsigned char pm, i=0, j=0;

setlocale(LC_CTYPE, "Russian");

FILE *fl;

for(;;)
{
puts("Выберите действие: \n");
puts("1. Сформировать строку и записать в файл");
puts("2. Считать строку и распечатать");
puts("3. Зашифровать строку и записать в файл");
puts("4. Расшифровать строку и записать в файл");
puts("5. Выход.\n");

pm=_getch();

switch(pm)
{
case '1':
if((fl=fopen("fl.txt", "w"))!=NULL) // Открываем файл только для записи
{
puts("Введите строку: \n");
SetConsoleCP(1251);
gets(Str1); //Ввод строки
fputs(Str1, fl); // запись строки в файл
SetConsoleCP(866);
fclose(fl); //Закрыть файл после записи

puts("Строка записана успешно \n");
}
else
{
puts("Ошибка при открытии файла \n");
}
break;

case '2':
if ((fl=fopen("fl.txt", "r"))!=NULL) // Открываем файл только для чтения
{
puts("Строка из файла: \n");
fgets(Str1, 100, fl); //Считывание строки из файла
puts(Str1);
printf("\n");
fclose(fl);
}
else
{
puts("Ошибка при открытии файла \n");
}
break;

case '3':
if ((fl=fopen("fl.txt", "w+"))!=NULL) // Открываем файл для чтения и записи
{
puts("Исходная строка:");
puts(Str1);
fgets(Str1, 100, fl);
printf("\n");

f(str1, str2);

SetConsoleCP(1251);
fputs(Str1, fl);
SetConsoleCP(866);
puts("Зашифрованная строка:");
puts(Str1);
printf("\n");
fclose(fl);

puts("Строка успешно записана в файл \n");
}
else
{
puts("Ошибка при открытии файла \n");
}
break;

case '4':
if((fl=fopen("fl.txt", "w+"))!=NULL) // Открываем файл для чтения и записи
{
puts("Исходная строка в файле:");
puts(Str1);
fgets(Str1, 100, fl);
printf("\n");

f(str1, str2);

SetConsoleCP(1251);
fputs(Str1, fl);
SetConsoleCP(866);
puts("Расшифрованная строка:");
puts(Str1);
printf("\n");
fclose(fl);
}
else
{
puts("Ошибка при открытии файла \n");
}
break;

case '5':
return;
default:
puts("Введите значение от 1 до 5 \n");
break;

}
}
}

void f( char *str1, char *str2)
{
for(int i=0; i<strlen(Str1)-1; i++)
{ if(i%2==0) // Замена четного символа на нечетный
{
Str2=Str1;
Str1=Str1[i+1];
Str1[i+1]=Str2;
}
}
 
K

kingl

Вот полностью рабочий код

Код:
#include <io.h>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <windows.h>
#include <ShellAPI.h>

void F( char*, char*);

void main()
{
char *Str1;
char *Str2;
unsigned char pm;

setlocale(LC_CTYPE, "Russian");

FILE *fl;

Str = (char *)malloc((100)*sizeof(char)); // Динамическое выделение памяти
if (Str == NULL) 
{
puts("Предел размерности ! ");
exit(0);			
}	

Str1 = (int *)malloc((100)*sizeof(int));
if (Str1 == NULL) 
{
puts("Предел размерности ! ");
exit(0);			
}	
for(;;)
{
puts("Выберите действие: \n");
puts("1. Сформировать строку и записать в файл");
puts("2. Считать строку и распечатать");
puts("3. Зашифровать строку и записать в файл");
puts("4. Расшифровать строку и записать в файл");
puts("5. Выход.\n");

pm=_getch();

switch(pm)
{
case '1':
if((fl=fopen("fl.txt", "w"))!=NULL)
{
puts("Введите строку: \n");
SetConsoleCP(1251);
gets(Str1);
fputs(Str1, fl);
SetConsoleCP(866);
fclose(fl);

puts("Строка записана успешно \n");
}
else
{
puts("Ошибка при открытии файла \n");
exit(1);
}
break;

case '2':
if((fl=fopen("fl.txt", "r"))==NULL)
{
printf("Не удается открыть файл.\n");
exit(1);
}
if (Str1[0])
{
puts("Строка из файла: \n");
fgets(Str1, 100, fl);
puts(Str1);
printf("\n");
fclose(fl);
}
else
{
puts("Сначала выполните пункт 1 \n");
}
break;

case '3':
if((fl=fopen("fl.txt", "w+"))==NULL)
{
printf("Не удается открыть файл.\n");
exit(1);
}
if (Str1[0])
{
puts("Исходная строка:");
puts(Str1);
fgets(Str1, 100, fl);
printf("\n");

F(Str1, Str2);

SetConsoleCP(1251);
fputs(Str1, fl);
SetConsoleCP(866);
puts("Зашифрованная строка:");
puts(Str1);
printf("\n");
fclose(fl);

puts("Строка успешно записана в файл \n");
}
else
{
puts("Сначала выполните пункт 1 \n");
}
break;

case '4':
if((fl=fopen("fl.txt", "w+"))==NULL)
{
printf("Не удается открыть файл.\n");
exit(1);
}
if(Str1[0])
{
puts("Исходная строка в файле:");
puts(Str1);
fgets(Str1, 100, fl);
printf("\n");

F(Str1, Str2);
SetConsoleCP(1251);
fputs(Str1, fl);
SetConsoleCP(866);
puts("Расшифрованная строка:");
puts(Str1);
printf("\n");
fclose(fl);
}
else
{
puts("Сначала выполните пункт 1 \n");
}
break;

case '5':
return;
default:
puts("Введите значение от 1 до 5 \n");
break;
}
}
}

void F( char *str1, char *str2)
{
for(int i=0; i<strlen(str1)-1; i++)
{			
if(i%2==0)
{
*str2=str1[i];
str1[i]=str1[i+1];
str1[i+1]=*str2;
}
}
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!