Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2016, 12:33   #1
Narsky
Форумчанин
 
Регистрация: 21.06.2016
Сообщений: 109
По умолчанию Работа с файлом

Нужна помощь с написанием одной из двух задач (2 мне кажется легче, но я понятия не имею, как можно заменить неизвестную букву на эту же букву, только заглавную):
Цитата:
Изменение данных в файле. Удалить все символы в файле находящиеся между скобками. Открывающаяся скобка обязательна, закрывающаяся нет. Например:
Исходный файл: d3g)h5(4gfy)7d(f6(gh(4d)jy)jc)gh5)j y(8u)i7h(jk
Конечный файл: d3g)h5()7d()gh5)jy()i7h(

Примечание: Результат работы с данными вывести на экран и в новый файл. Файл с входными данными имеет название INPUT.TXT для текстовых файлов и INPUT.DAT для двоичных. Файл, в который записывается результат, называется OUTPUT.TXT для текстовых файлов или OUTPUT.DAT для двоичных. Для создания файлов с исходными данными можно использовать различные утилиты (например, Binary Viewer). Число элементов при считывании файла определяется его длиной, либо, если этого не определяет алгоритм, двумя сотнями (200). Лучшими решениями считаются те, где нет привязки к количеству элементов в файле. При необходимости можно использовать временный файл для хранения промежуточных результатов.
Цитата:
Замена элементов файла. Написать функцию, которая заменяет в файле все буквы, совпадающие с той, которую ввёл пользователь, на заглавные.

Примечание: Результат работы с данными вывести на экран и в новый файл. Файл с входными данными имеет название INPUT.TXT для текстовых файлов и INPUT.DAT для двоичных. Файл, в который записывается результат, называется OUTPUT.TXT для текстовых файлов или OUTPUT.DAT для двоичных. Для создания файлов с исходными данными можно использовать различные утилиты (например, Binary Viewer). Число элементов при считывании файла определяется его длиной, либо, если этого не определяет алгоритм, двумя сотнями (200). Лучшими решениями считаются те, где нет привязки к количеству элементов в файле. При необходимости можно использовать временный файл для хранения промежуточных результатов.
Narsky вне форума Ответить с цитированием
Старый 30.06.2016, 13:29   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

А в чем проблема с первой? В лоб:
0. флаг равен 0
1. читаем по одному символу и пока не флаг пишем в выходной
а) если встретили (, то флаг + 1
б) если встретили ) и флаг > 0, то флаг - 1
p51x вне форума Ответить с цитированием
Старый 30.06.2016, 13:41   #3
Narsky
Форумчанин
 
Регистрация: 21.06.2016
Сообщений: 109
По умолчанию

Да я сам по себе очень плохо шарю в файлах, не умею работать с ними. Вот получившийся код, примерный, но...
Код:
/*Изменение данных в файле*/
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
	setlocale(0, "rus");

	FILE *file;
	char *fname1 = "INPUT.txt";
	char *fname2 = "OUTPUT.txt";

	char S[200];
	int i;
	cout << "Введите S ";
	cin >> S;

	file = fopen(fname1, "w");
	fprintf(file, "%c ", S);
	fclose(file);
	
	file = fopen(fname1, "r");
	fseek(file, 0, SEEK_SET);
	cout << "\nИсходный файл, записанный в INPUT.txt:\n";
	fscanf(file, "%c", S);        	
	fclose(file);

	for ( int i = 0; i < sizeof(S); i++)
	{
		int flag = 0;
		if (S[i] == '(') flag = flag + 1;
		if ((S[i] == ')') && (flag > 0)) flag = flag - 1;
	}

	file = fopen(fname2, "w");
	for (i = 0; i < sizeof(S); i++)
	{
		fprintf(file, "%i ", S[i]);
	}
	fclose(file);
	
	file = fopen(fname2, "r");
	fseek(file, 0, SEEK_SET);
	cout << "\nКонечный результат:\n";
	
	while (!feof(file))
	{
		fscanf(file, "%i", &S[i]);      			
		cout << " " << S[i];
		i++;
	}
	fclose(file);
	
	cout << endl;
	system("pause");
	return 0;
}
Narsky вне форума Ответить с цитированием
Старый 30.06.2016, 13:48   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Что вы бред написали.

Написал читаем посимвольно - вы же завели массив и прочитали в него один символ
Написал анализируем каждый прочитанный символ меняем флаг и в конце пишем символ, если надо в выходной - вы же типа всю строку пробежали и флаг для всей строки нашли
+ запись в файл вообще не зависит от флага...

Где ваша элементарная логика? А потом - я не понимаю файлы... вы шнурки то хоть умеете завязывать?
p51x вне форума Ответить с цитированием
Старый 30.06.2016, 14:05   #5
Narsky
Форумчанин
 
Регистрация: 21.06.2016
Сообщений: 109
По умолчанию

Кажется я понял. Т.е., открываем первый файл, туда заносим массив и показываем его на экран, закрываем его, открываем второй файл, заносим массив и с помощью цикла ищем '(', как только находим, ставим флаг + 1, далее все символы пропускаются до того момента, как находим '(' или ')' и флаг +1, флаг ставим на 0. После цикла выводим на экран и закрываем файл, так?
Т.е., цикл нужно поместить во второй файл?
А до цикла код правильно написан?
Narsky вне форума Ответить с цитированием
Старый 30.06.2016, 14:09   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

нет. не надо никаких массивов.

Код:
открываем входной файл
открываем выходной файл
повторять пока не конец входного файла
 читаем по ОДНОМУ СИМВОЛУ из входного
 ПРОВЕРЯЕМ СИМВОЛ И МЕНЯЕМ ФЛАГ
 если флаг равен 0, то пишем ЭТОТ ОДИН СИМВОЛ в выходной
конец повторяем
закрываем файлы
p51x вне форума Ответить с цитированием
Старый 30.06.2016, 14:27   #7
Narsky
Форумчанин
 
Регистрация: 21.06.2016
Сообщений: 109
По умолчанию

Код:
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
	setlocale(0, "rus");

	FILE *file;
	char *fname1 = "INPUT.txt";
	char *fname2 = "OUTPUT.txt";

	char S[200];
	int i;
	cout << "Введите S ";
	cin >> S;

	file = fopen(fname1, "w");
	for (i = 0; i < sizeof(S); i++)
		fprintf(file, "%c ", S[i]);
	fclose(file);
	
	
	cout << "\nИсходный файл, записанный в INPUT.txt:\n";
	for (i = 0; i < sizeof(S); i++) cout << S[i];

	file = fopen(fname1, "r");
	file = fopen(fname2, "w");

	while (!feof(file))
	{
		fscanf(file, "%c", S[i]);  
		fseek(file, 0, SEEK_SET);
Как читать по одному символу?
До этого момента все правильно?
Narsky вне форума Ответить с цитированием
Старый 30.06.2016, 14:32   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
До этого момента все правильно?
А вы как думаете, если
Цитата:
не надо никаких массивов.
Цитата:
Как читать по одному символу?
Код:
fscanf(file, "%c", S[i]);
p51x вне форума Ответить с цитированием
Старый 30.06.2016, 14:42   #9
Narsky
Форумчанин
 
Регистрация: 21.06.2016
Сообщений: 109
По умолчанию

Код:
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
	setlocale(0, "rus");

	FILE *file;
	char *fname1 = "INPUT.txt";
	char *fname2 = "OUTPUT.txt";

	char S[200];
	int i;
	cout << "Введите S ";
	cin >> S;

	file = fopen(fname1, "w");
	for (i = 0; i < sizeof(S); i++)
		fprintf(file, "%c ", S[i]);
	fclose(file);
	
	
	cout << "\nИсходный файл, записанный в INPUT.txt:\n";
	for (i = 0; i < sizeof(S); i++) cout << S[i];

	file = fopen(fname1, "r");
	file = fopen(fname2, "w");

	while (!feof(file))
	{
		fscanf(file, "%c", S[i]);  
		fseek(file, 0, SEEK_SET);
		int flag = 0;
		if (S[i] == '(') flag = flag + 1;
		if ((S[i] == '(' || ')') && (flag = 0)) flag = flag - 1;
		if (flag = 0)
		{
			fscanf(file, "%i", &S[i]);
		}
	}
	fclose(file);

	file = fopen(fname2, "r");
	fseek(file, 0, SEEK_SET);
	cout << "\nКонечный результат:\n";
	
	while (!feof(file))
	{
		fscanf(file, "%c", &S[i]);      			
		cout << " " << S[i];
		i++;
	}
	fclose(file);

	cout << endl;
	system("pause");
	return 0;
}
Не надо массивов вообще или именно в цикле?
Narsky вне форума Ответить с цитированием
Старый 30.06.2016, 14:44   #10
Narsky
Форумчанин
 
Регистрация: 21.06.2016
Сообщений: 109
По умолчанию

Нужно использовать строку, так?
Narsky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлом Despot777 Общие вопросы C/C++ 3 26.10.2013 14:51
Работа с файлом Rik55rus Общие вопросы C/C++ 5 06.10.2012 15:35
Работа с файлом! Kami-sama Visual C++ 0 07.05.2011 20:48
работа с файлом Настя9008 Помощь студентам 19 06.12.2010 23:18
Работа с файлом Leoman Помощь студентам 0 02.04.2010 21:57