Консультация № 42785
12.05.2006, 01:46
0.00 руб.
0 2 1
Доброй ночи, уважаемые эксперты! Нужно в С написать прогу, кот будет из текстового файла, в котором находится телефонная база считывать запись под введенным с клавиатуры номером и выводить ее на экран и это будет повторяться пока не будет введена #... Заранее спасибо.

Приложение:
(пример текстового файла)1 Иванов Павел 5667782 Петров Игорь 7867563 Сидоров Николай 455667

Обсуждение

давно
Руководитель
1
1525
13.05.2006, 06:14
общий
Karina, а вы сами написать данную программу попробовали? Если да, выкладывайте ваш код - разберем ваши ошибки;) Если нет - то извините, тут помогают с решением проблем, а не делают всю работу за других..
Об авторе:
Если не знаешь, что делать - делай шаг вперед.

Неизвестный
13.05.2006, 22:07
общий
это ответ
Здравствуйте, Karina!
Пожалуйста, но сперва несколько коментариев:
для выхода предлагаю вводить -1, а не ‘#‘, т.к. у символа ‘#‘ код 35, а значит это вносит ограничения на количество записей в базе данных. Конечно, это можно обойти, но легче и не подходить :)
телефон можно запасывать и так: 56-67-78
все поля, и имя и фамилия и номер телефона не должны быть длинее 254 символов
имя файла базы данных задаётся как параметр, если он не задан, то открывается файл по умолчанию, с именем "default.txt"

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

struct telebase
{
int id; // идентификатор (номер)
char *surname; // фамилия
char *name; // имя
char *number; // номер телефона
telebase *next;
};

telebase* Find(telebase *base, int id)
{
telebase *pt(base->next);
// файл данных упорядочен по идентификаторам
// если нет, то в следующей строке убрать "&& telebase->id < id"
while(pt != NULL && pt->id < id)
pt = pt->next;
// если файл данных не упорядочен, то убрать следующие 2 строки
if(pt == NULL || pt->id > id)
return NULL;
return pt;
}

int LoadFromFile(char FileName[], telebase *base)
{
int i(0);
FILE *fp;
if((fp = fopen(FileName, "r")) != NULL)
{
telebase *pt(base);
char str[255]; // предполагаем, что ни имя ни фамилия, ни номер телефона не длинее 255 символов
while(!feof(fp))
{
pt->next = new telebase;
pt = pt->next;
fscanf(fp, "%i", &pt->id); // читаем id
fscanf(fp, "%s", str); // читаем фамилию
pt->surname = new char[strlen(str) + 1];
strcpy(pt->surname, str);
fscanf(fp, "%s", str); // читаем имя
pt->name = new char[strlen(str) + 1];
strcpy(pt->name, str);
fscanf(fp, "%s", str); // читаем телефон
pt->number = new char[strlen(str) + 1];
strcpy(pt->number, str);
i++;
}
pt->next = NULL;
fclose(fp);
}
return i;
}

void main(int argc, char* argv[])
{
int id;
telebase base, *pt;
if(argc == 1) // если имя файла данных не задано как параметр
id = LoadFromFile("default.txt", &base); // открываем файл по умолчанию
else
id = LoadFromFile(argv[1], &base);
printf("\nLoading %d users\n", id);
printf("\nEnter ID (for exit enter -1) >> ");
scanf("%i", &id);
while(id != -1)
{
pt = Find(&base, id);
if(pt == NULL)
printf("\nUser not found\n");
else
printf("\nsurname: %s\nname: %s\nnumber: %s\n----------------------------------\n",
pt->surname, pt->name, pt->number);
printf("\nEnter ID (for exit enter -1) >> ");
scanf("%i", &id);
}
}
Форма ответа