Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 1
Регистрация: 05.09.2015
Сообщений: 212

Поиск в телефонном справочнике текстовом файле

26.02.2016, 15:25. Показов 2695. Ответов 10
Метки нет (Все метки)

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


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Console.WriteLine("Поиск в телефонном справочнике.");
            Console.WriteLine("Введите именя и нажмите <Enter>.");
 
            Console.Write("-> ");
            string firstName = Console.ReadLine();
 
            FileStream fs = new FileStream("phone.txt", FileMode.Open, FileAccess.Read);
 
            StreamReader sr = new StreamReader(fs);
 
            string alltext = sr.ReadToEnd();
 
            sr.Close();
            fs.Close();
 
           // string FileContent = System.IO.File.ReadAllText("numbers.txt");
 
            string[] srList;
            srList = alltext.Split(' ', '\n');
 
            for (int i = 0; i < srList.Length; i++)
            {
               // Console.WriteLine(srList[i]);
 
                if (srList[i].ToString() == firstName)
                {
                    Console.WriteLine(srList[i]);
                    Console.WriteLine(srList[i + 1]);
                    Console.WriteLine(srList[i + 2]);
                }
            }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.02.2016, 15:25
Ответы с готовыми решениями:

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

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

Поиск в телефонном справочнике
Написать программу, которая позволяет найти нужные сведения в телефонном справочнике (a:\phone.txt). Программа должна запрашивать фамилию...

10
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
26.02.2016, 15:34
eluzor, формат файла какой? И чем вам не нравится метод File.ReadAllLines()?
1
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
26.02.2016, 15:39
Добавьте параметр-кодировку:
C#
1
StreamReader sr = new StreamReader(fs, Encoding.Default);
Но, как справедливо заметил EvilFromHell лучше применить File.ReadAllLines. И даже в File.ReadAllLines не забудьте указать кодировку.
1
0 / 0 / 1
Регистрация: 05.09.2015
Сообщений: 212
26.02.2016, 19:56  [ТС]
всё теперь иероглифами отображаеться
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
26.02.2016, 20:04
Цитата Сообщение от eluzor Посмотреть сообщение
всё теперь иероглифами отображаеться
Это уже прогресс! Раньше вообще ничего не выводилось.
Код тот же или с помощью File.ReadAllLines читаете?
Кстати, попробуйте с кодировками поэкспериментировать после StreamReader(fs, Encoding ставьте точку и выбирайте поочередно предлагаемые.
0
115 / 92 / 66
Регистрация: 27.04.2014
Сообщений: 307
26.02.2016, 20:09
Цитата Сообщение от eluzor Посмотреть сообщение
C#
1
srList = alltext.Split(' ', '\n');
Это как-то подозрительно, неужели тебе нужно именно так делить что бы выявить данные по имени которое вводит пользователь? Тут в массиве srList будет просто каша. Какой вообще формат файла, всё данные одного человека записаны в строку или может в столбец?
0
0 / 0 / 1
Регистрация: 05.09.2015
Сообщений: 212
26.02.2016, 20:23  [ТС]
если вот так пишу в консли кирилице "имя", то выдают список только имен. если пишу латиницей "Dmitrii" , а имена я вводил через консоль латиницей , то ничего не отображаеться.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Console.WriteLine("Поиск в телефонном справочнике.");
            Console.WriteLine("Введите именя и нажмите <Enter>.");
 
            Console.Write("-> ");
            string firstName = Console.ReadLine();
 
            FileStream fs = new FileStream("phone.txt", FileMode.Open, FileAccess.Read);
 
            StreamReader sr = new StreamReader(fs,Encoding.UTF8);
 
            string alltext = sr.ReadToEnd().ToLower();
 
            sr.Close();
            fs.Close();
 
 
            string[] srList;
            srList = alltext.Split(' ', '\n');
 
            for (int i = 0; i < srList.Length; i++)
            {
              //  Console.WriteLine(srList[i]);
 
                if (srList[i].ToString() == firstName)
                {
                    Console.WriteLine(srList[i+2]);
                }
            }
Добавлено через 2 минуты
не совсем понимаю как лучше использовать File.ReadAllLines()

Добавлено через 5 минут
вот в таком формате храниться в файле. кодировка UTF-8
Имя : Dmitrii
Фамилия : Nagiev
Телефон : 5672632
================================


Имя : Anton
Фамилия : Pahomov
Телефон : 5625722
================================


Имя : Andrei
Фамилия : Verbljudov
Телефон : 55998811
================================
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
26.02.2016, 20:44
Лучший ответ Сообщение было отмечено eluzor как решение

Решение

eluzor,
Зачем такой непрактичный формат?
Можно, конечно, и такой формат распарсить, но значительно удобнее хранить данные в формате один человек - одна строка. Т.е.:
Иван Иванов 234-65-45
Петр Петров 344-55-44
Семен Семенов 463-65-45
В этом случае все просто:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string fileName = "phone.txt";
if (File.Exists(fileName))
{
    string[] lines = File.ReadAllLines(fileName, Encoding.Default);
    Console.WriteLine("Поиск в телефонном справочнике.");
    Console.WriteLine("Введите имя и нажмите <Enter>.");
    Console.Write("-> ");
    string firstName = Console.ReadLine();
    foreach (string line in lines)
    {
        string[] fields = line.Split();
        if (fields[0] == firstName)
            Console.WriteLine(line);
    }
}
else
{
    Console.WriteLine("Файл не найден!");
}
0
0 / 0 / 1
Регистрация: 05.09.2015
Сообщений: 212
26.02.2016, 20:45  [ТС]
не могу понять , почему вообще на кирилу консоль реагирует. а на латиницу нет.
0
115 / 92 / 66
Регистрация: 27.04.2014
Сообщений: 307
26.02.2016, 20:46
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            string[] srList = allText.Split('\n');
            string lastname,phone;
            
            for (int i = 0; i < srList.Length; i++)
            {
                if (srList[i].Contains(firstName)) // где srList[i] это строка типо "Имя : Dmitrii"
                {
 
                     index = srList[i+1].IndexOf(':') +2 ;
                     lastname = srList[i+1].Substring(index);  // отделяем всё лишнее от фамили
                     index = srList[i + 2].IndexOf(':') + 2;
                     phone = srList[i + 2].Substring(index); // отделяем всё лишнее от номера телефона
                    Console.WriteLine("Lastname: {0}, Phone: {1}",lastname,phone);
                }
            }
Это прям в лоб.
Попробуй заменить свои строки на представленные выше, думаю со смыслом разберёшься. Делить текстовый документ не надо как попало, а надо как у меня, по строчкам. Далее небольшие махинации с отбрасыванием лишних символов и получаем искомые фамилию и номер.
0
0 / 0 / 1
Регистрация: 05.09.2015
Сообщений: 212
27.02.2016, 12:08  [ТС]
я изначально задал так чтоб сохранялись данные в таком формате , чтоб бы при отрытии его обычным пользователем было все разделено и понятно.
вот код как делал изначально --

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
do
            {
                FileStream fs = new FileStream("phone.txt", FileMode.OpenOrCreate, FileAccess.Read);
                fs.Close();
 
 
                FileStream fs2 = new FileStream("phone.txt", FileMode.Append, FileAccess.Write);
 
                StreamWriter sr = new StreamWriter(fs2);
            link1:
                Console.Write("Введите имя -> ");
                string name = Console.ReadLine();
                sr.WriteLine("{0} : {1}", imja, name);
 
                Console.Write("Введите фамилию -> ");
                string lastname = Console.ReadLine();
                sr.WriteLine("{0} : {1}", familija, lastname);
 
                Console.Write("Введите номер телефона -> ");
                string phoneNumber = Console.ReadLine();
                sr.WriteLine("{0} : {1}", telefon, phoneNumber);
                sr.WriteLine("================================");
                sr.WriteLine("\n");
 
                Console.WriteLine("Информация добавлена !");
 
                Console.WriteLine("\n");
 
                Console.WriteLine("Желаете ввести ещё один номер или закрыть программу ?");
 
                Console.WriteLine("для закрытия 1");
                Console.WriteLine("для продожения 2");
                Console.Write("-> ");
                variant = int.Parse(Console.ReadLine());
 
                if (variant == 2)
                {
                    goto link1;
                }
                sr.Close();
 
                fs2.Close();
            } while (variant != 1);
Добавлено через 15 часов 8 минут
а как быть , если у меня в файде 5 человек с фамилией Иванов, как то можно реальизовать этот же код , но чтоб он работал корректно ?


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 Console.WriteLine("Поиск в телефонной книге");
            Console.WriteLine("Введите название файла");
            Console.Write("-> ");
            string fileName = Console.ReadLine();
            if (fileName != "phone.txt")
            {
                Console.WriteLine("file not found");
 
            }
 
            int key = 0;
 
            do
            {
                if (File.Exists(fileName))
                {
                    string[] lines = File.ReadAllLines(fileName, Encoding.Default);
 
 
 
                    Console.WriteLine("Введите Фамилию, кого хотите найти");
                    Console.Write("-> ");
                    string lastName = Console.ReadLine();
 
                    foreach (string line in lines)
                    {
                        string[] search = line.Split();
                        for (int i = 0; i < search.Length; i++)
                        {
                            if (search[1] == lastName)
                            {
                                Console.WriteLine(line);
                            }
                        }
                    }
                }
 
                Console.WriteLine();
                Console.WriteLine("Хотите продолжить поиск ? ");
                Console.WriteLine("1 - да , 2 - нет");
                key = int.Parse(Console.ReadLine());
 
 
            } while (key != 2);
Добавлено через 4 минуты
добавил в цикле, но тогда выдает всех людей с нужной фамилией и дублирует их по нескольку раз
C#
1
for (int i = 0; i < search.Length - 1; i++)
Добавлено через 58 секунд
точнее в телефонной книге 6 разных человек. 3 из них с фамилией Иванов. мне выдает в результате 6 раз Ивановых.

Добавлено через 3 минуты
всё разобрался , Всем спасибо за ответы !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2016, 12:08
Помогаю со студенческими работами здесь

Поиск в телефонном справочнике
Напишите программу, выполняющую поиск в телефонном справочнике, состоящем из 5 записей. Заранее спасибо!!!!!!

Бинарный поиск в телефонном справочнике
Программа телефонный справочник ввожу абонентов номера потом хочу сделать сортировку по возрастанию(фамилию) не получается почему? Далее...

Сделать поиск в телефонном справочнике
Мне надо сделать поиск в телефонном справочнике.Как сделать помогите!!!? У меня уже всьо сделано,все подключено к DBGridу,отображаютса...

Организовать поиск в телефонном справочнике
Пишу обычный телефонный справочник. Сохраняет все txt. Помогите написать код для кнопки найти, чтобы в viewbox выводился только нужный нам...

Как сделать поиск в телефонном справочнике
Что бы искало по фамилии и по городу!!!!Помогите пожалуста!)))


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru