LINUX.ORG.RU

Работа с файлами в С [поиск в файле]


0

0

Привет! 
Только начал изучать С. 
Вопрос такой, как искать в файле по запросу… 
Например. Есть консольная прога типа записная книжка. Есть файл, который по задумке исполняет роль БД. 
В файле через таб записано что то типа этого… 

Дима	Моб	132
Дима	Дом	236
Гена	Моб	321
Гена	Дом	789

А программа выдает запрос типа: 
Введите Имя:
Введите категорию тел: 

И программа должна выдать телефон:  
-------------------
Введите Имя: Дима
Введите категорию тел: Дом 

Телефон 236
--------------------

Как это все реализовать? Если не сложно дайте пример выше описанного… 

PS. Сильно не пинайте, только начал разбираться в С… готовлюсь к поступлению в  институт! 

Заранее спасибо! 
anonymous

По хорошему, повторяю "по хорошему", надо сделать стркутуру
"строка таблицы" и функции чтения в память массива/чтения строки
и тд...

например (я буду писать class, несмотря на то что это структуры):
class DBEntry {
  char *name;
  char *type;
  char *phone;
};

FILE *db_open();
DBEntry *db_read_entry(FILE *file);/*Возвращает NULL если конец файла или ошибка*/
DBEntry **db_read_entries(FILE *file);/*Использует db_read_entry*/
void db_close(FILE*file);

далее разумеется всё просто...

vahvarh ★★★
()

Примитивный пример

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
	char name[32], phone_type[32];
	int phone;
	FILE *f;

	if(!(f=fopen("data", "r")))
		return 1;
	while (!feof(f)) {
		fscanf(f, "%s\t%s\t%d\n", name, phone_type, &phone);
		if (!strcmp(name, "Дима") && !strcmp(phone_type, "Дом"))
		printf("%s %s %d\n", name, phone_type, phone);
	}
	fclose(f);

	return 0;
}

Как из этого примера сделать требуемую программу?
1. Принимать имя файла как параметр командной строки.
2. Прочитать файл и сохранить содержимое в памяти (придумать как, возможны варианты).
3. Принять данные с консоли, выполнить поиск, выдать результат.
3.1. Обработать ситуацию "ничего не найдено".
3.2. Засунуть запрос и поиск в цикл, чтобы можно было выполнять запрос несколько раз.
     Подумать, как выйти из этого цикла.
4. Никогда не писать ничего подобного для реальных задач!
   (Это годится только как учебный пример).

DKorolkov
()

> Как это все реализовать? Если не сложно дайте пример выше описанного. 
Для такого простого критерия поиска можно просто построчно анализировать файл, разбивая каждую строку на поля, 
и проверять выполнение критерия.
----------------
while ( fgets(buf, sizeof(buf), file) != NULL ) {
  //разбить buf на поля Name, Type, Number
  //struct Record { char* name, *type, *number; } r
  //r.name = buf[0:strchr(buf, '\t')]
  //r.type = ... аналогично ...
  if ( P(r, aCriterion) )
    puts(buf);
}
----------------
где P - предикат, проверяющий, удовлетворяют ли значения полей в r (текущая строка файла) заданному критерию.
[код написан прям в браузере, часть его является "псевдокодом"]

В более сложных случаях, требующий быстродействия или большей сложности критериев, имеет смысл либо хранить в памяти всю структуру в отсортированном виде (массив/список/хэш записей), либо строить над ней индексы.

phoenix ★★★★
()

Большое всем спасибо!

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