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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2013, 01:49   #1
AFA
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 69
По умолчанию считывание строки из файла для последующего редактирования

Доброе время суток!
Вот как-то не могу понять как сделать редактирование из строки файла..
Есть структура:
Код:
struct Library{
	int num;
	char name[ mas ];
	char fam[ mas ];
};
Данные в файле находятся в виде:
1. Петров - Антон
2. Степанов - Владимир
и т.д.

Логичнее считать данные (посимвольно) из файла до встречи ".", записать ее в Library.num, потом позиция num+2 символа(это "." и пробел), опять считать данные до "-", записать их в Library.name, далее позиция Library.name+2("-" и пробел), считаем до "\n" записываем в Library.fam..
Для редактирования обратиться к определенному Library.num и заменить данные..

Помогите со считыванием файла\строки в структуру.. Работаю с файлом через потоки.
AFA вне форума Ответить с цитированием
Старый 14.11.2013, 13:23   #2
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от AFA Посмотреть сообщение
Есть структура:
Код:
struct Library{
	int num;
	char name[ mas ];
	char fam[ mas ];
};
Данные в файле находятся в виде:
1. Петров - Антон
2. Степанов - Владимир
и т.д.
Читайте построчно и разбирайте каждую строку. Если хотите выдирать по подстрокам - есть у функция Pos() \\ (если нет у вас такой - посмотрите strpos() ) \\.

Последний раз редактировалось Baburek; 14.11.2013 в 13:32.
Baburek вне форума Ответить с цитированием
Старый 14.11.2013, 14:46   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Данные в файле находятся в виде:
Это принципиально? Может можно типизированный фал использовать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2013, 16:05   #4
AFA
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это принципиально? Может можно типизированный фал использовать?
Типизированный файл?
Хотелось конечно при выводе на экран иметь что-то подобное..
Тогда мне придется переделывать остальной код ( добавление\ удаление заданной строки), но если с ним проще и удобнее работать и Вы мне поможете: я готов. =)
AFA вне форума Ответить с цитированием
Старый 14.11.2013, 16:14   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Помогу. Примером. Я часто его даю здесь, так как считаю его базисом.
http://www.programmersforum.ru/showthread.php?t=105501
Там и запись и чтение. Проанализируй пример и используй в своей задаче.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2013, 20:19   #6
AFA
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Помогу. Примером. Я часто его даю здесь, так как считаю его базисом.
http://www.programmersforum.ru/showthread.php?t=105501
Там и запись и чтение. Проанализируй пример и используй в своей задаче.
Спасибо! Буду пробовать, если что буду спрашивать..

Последний раз редактировалось AFA; 14.11.2013 в 20:22.
AFA вне форума Ответить с цитированием
Старый 15.11.2013, 01:33   #7
AFA
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 69
По умолчанию

все -таки решил по своему...

Код:
void cFile::editRec( )
{
	char *buff = new char [ 50 ];
	int nCount = 100;
	char delim = '\n';
	fstr.open(fileName);
	if(!fstr.is_open()){
		cout << "Bad.\n";
		exit(1);
	}
		cFile::View( ); //просмотр файла
		q = cFile::numLines(); // определение кол-ва строк файла
		int w = 0; // = 0
		int i = 0; // = vibor

		cout << "Tipe record rof change: \n";
		cin >> i;
			if( i < w || i > q){
				cerr << "Invalid record number -- bye\n";
				exit(EXIT_FAILURE);
			}
				while( w != i ){
					fstr.getline( buff, nCount, delim );
					int u = 0;// sizeof(buff);
					for( int r = 0; r < buff[ u ]; r++){
						if(buff[u] == '.'){
							cout << buff[u] << endl;
						}
							else if(buff[u] == '-'){
								cout << buff[u] << endl;
							}
								else if(buff[u] == '\n'){
										cout << buff[u] << endl;
								}
						u++;
					}

				cout << buff << endl;
				w++;
				}
		delete[ ] buff;
		fstr.close();
}
На выходе имею:
Цитата:
Here are the current contents of the cppstudio.txt file:
1. qwqwq - wqwq
2. erer - ffff
3. qweasq - xcvsq
4. e33r - f44


Tipe record rof change:
2
.
-
1. qwqwq - wqwq
.
-
2. erer - ffff
Не пойму, почему в массиве не ищет символы..
И еще, как сделать getline для заданной строки?

Последний раз редактировалось AFA; 15.11.2013 в 01:42.
AFA вне форума Ответить с цитированием
Старый 15.11.2013, 11:45   #8
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от AFA Посмотреть сообщение
И еще, как сделать getline для заданной строки?
Менее извращенного способа, чем доставать по строчке и считать, в голову не приходит. Или плохой вариант?

Плюс: Можете пожалуйста пояснить идею "выдирания" нужных данных в вашем алгоритме. Вы смотрите каждый символ:

Код:
if(buff[u] == '.'){  //если buff[u] равен "."
							cout << buff[u] << endl; //вы выводите эту точку
						}
							else if(buff[u] == '-'){ //если buff[u] равен "-"
								cout << buff[u] << endl; //вы выводите "тирешку"
							}
Я разобраться просто пытаюсь
Baburek вне форума Ответить с цитированием
Старый 15.11.2013, 12:51   #9
AFA
Пользователь
 
Регистрация: 19.04.2009
Сообщений: 69
По умолчанию

Цитата:
Сообщение от Baburek Посмотреть сообщение
Менее извращенного способа, чем доставать по строчке и считать, в голову не приходит. Или плохой вариант?
Плюс: Можете пожалуйста пояснить идею "выдирания" нужных данных в вашем алгоритме. Вы смотрите каждый символ:

Я разобраться просто пытаюсь
Задумка была:
Берем строку ( строки хранятся в виде: 1. Алексей - Петров ), ищем "." запоминаем ее позицию, позиция точки -1, - это номер записи Library.num. Ищем "-" со смещением + 1, запоминает ее позицию -1, - это имя Library.name. Ищем "\n" со смещением + 1, запоминает ее позицию -1, - это фамилия Library.fam. Как-то так..
Наверное не самый оптимальный алгоритм..
AFA вне форума Ответить с цитированием
Старый 15.11.2013, 13:51   #10
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от AFA Посмотреть сообщение
Задумка была:
Берем строку ( строки хранятся в виде: 1. Алексей - Петров ), ищем "." запоминаем ее позицию, позиция точки -1, - это номер записи Library.num. Ищем "-" со смещением + 1, запоминает ее позицию -1, - это имя Library.name. Ищем "\n" со смещением + 1, запоминает ее позицию -1, - это фамилия Library.fam. Как-то так..
Наверное не самый оптимальный алгоритм..
По сути получается вы выводите один только символ: который находите. Если сохранить логику: можно взять строку полностью, найти вашу точку и "вырезать" все остальное(насколько я понял так и предполагалось).

Вариант того, как это можно сделать: [длина строки] - [длина строки до вашей точки(с конца)]
По сути это и будет ваше значение.

Можно поступить проще, записать все в виде:
Код:
[1, Петров, Антон]
Есть функции, которые позволят вам по запятой разбивать такую запись. Т.е. берете строку "1, Петров, Антон" и говорите "выдирай-ка мне, программа, подстроки до каждой запятой".

Это как идеи, которые действительно будут работать. Но оптимальное ли это решение - конечно вопрос...

Последний раз редактировалось Baburek; 15.11.2013 в 14:05.
Baburek вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
считывание строки из файла kibcat Общие вопросы C/C++ 2 17.05.2012 10:46
Добавление запроса ввода пароля для редактирования файла. Hezorin Общие вопросы Delphi 1 15.02.2012 14:21
Считывание файла со второй строки (delphi) CAMOBAP Помощь студентам 19 12.01.2011 23:04
Повторное открытие файла txt для редактирования в delphi Shaggrath Помощь студентам 8 20.07.2009 13:36
Считывание строки из файла до символа Stormzcooler Общие вопросы Delphi 7 18.12.2006 15:01