Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
1

Поиск в бинарно-открытом файле

09.03.2012, 21:32. Просмотров 515. Ответов 4
Метки нет (Все метки)

Друзья! очень нужна помощь!

C
1
FILE *fin=fopen(def,"ab+");
Открываю файл, в нем база... 3 записи допустим:

1-2-3-4
2-3-4-5
3-4-5-6

Делаю поиск по 1му значению, ищу "2", нахожу вторую запись, и вхожу в if(){}

тут у меня:

C
1
2
3
4
5
                                fseek(fin,(p)*sizeof(group),SEEK_SET);
                fread(&group,sizeof(group),1,fin);
                fseek(fin,(p-1)*sizeof(group),SEEK_SET);    
                fwrite(&group,sizeof(group),1,fin);
                fseek(fin,0,SEEK_SET);
р - это счетчик чтения структу.. т.е. первую прочитало, первые элементы не совпали, пошло дальше, р++, вторую прочитало, р++ , элементы совпали, мы попали в условие моё..

цель: взять структуру номер 3, поставить на место структуры номер 2, т.е. это своеобразное удаление..

В итоге:

ничего не работает, всё проходит вроде как отлично, но в добавок к базе из 3х структур добавляется еще одна!

Мои мысли:

Я думаю что я что=то не так делаю в плане работы с ф-цией fseek , не подскажете что как? Просто записи новые добавляются в конец файла и всё.. поэтому такие мысли..

И в добавок:

Брал , проверял позицию fgetpos функцией, хоть она и показывала ******* число, но! Заметил что:

Кликните здесь для просмотра всего текста
fseek(fin,(p)*sizeof(group),SEEK_SET);
fgetpos()
fseek(fin,(p-1)*sizeof(group),SEEK_SET);
fgetpos()


в 2х случаях были одинаковые позиции.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2012, 21:32
Ответы с готовыми решениями:

Замена структуры в бинарно-открытом файле
Собственно, уже на форуме помогали с одной темкой... Суть такова: Работаю с файлами.. файл...

Сохранение структуры в бинарно-открытый файл. Кто подскажет?
Всем привет!) собственно проблема: FILE *fin=fopen(def,"a+b"); puts("\nEnter...

Как организовать поиск в открытом файле htm на диске?
Как организовать поиск в открытом файле HTM на диске !!!! Можно ли так выполнить! Дело в том, что...

Бинарно-последовательный поиск
Здраствуйте.Ктонить может написать алгоритм бинарно-последновательного поиска.Плз в инете искал...

Работа в файле при открытом MsgBox
Суть задумки такова: MsgBox приостанавливает работу макроса для того, чтобы можно было заполнить в...

4
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
09.03.2012, 21:40 2
лучше весь код, который имеет отношение к проблеме сюда выкладывате.
а еще рассмотрите вариант чтения всех структур в массив, манипуляции с массивом и слив массива обратно в файл. при небольших размерах файлов это вполне оправданно да и проще в реализации.
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
09.03.2012, 22:42  [ТС] 3
не, я понимаю что удобнее в памяти поработать, но.. надо решить задачу в файле..

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
void del()
        {
                int i=0,m,j=0,scored,massiv[200];   
                st group,buff,arr[10];
                FILE *fin=fopen(def,"ab+");
                    char named[40];
                    char addrd[40];
                    char dateofbd[40];
 
 
        puts("Выберите параметр, по которому вы хотите провести удаление:");
                puts("\n 1) Удаление по имени");
                puts("\n 2) Удаление по адрессу");
                puts("\n 3) Удаление по дате рождения");
                puts("\n 4) Удаление по среднему балу");
                puts("\n 5) Удаление по номеру в базе\n");
                puts("\n\n 6) Вернуться в главное меню\n");
 
                scanf("%d",&m);
            
                switch(m)
                {
                        case 1: 
                            {   
                                system("cls");
                                puts("Введите имя для удаления (Имя.Фамилия):");
                                scanf("%s",named);
                                int p=0;
              while(!feof(fin))
                        {
                            if(!fread(&group, sizeof group, 1, fin))
                            break;
                            int q=strcmp(named,group.name);
                                    p++; 
                                        if(q==0)
                                {   
                                    fseek(fin,(p)*sizeof(group),SEEK_SET);
                                    fread(&group,sizeof(group),1,fin);
                                    fseek(fin,(p-1)*sizeof(group),SEEK_SET);    
                                    fwrite(&group,sizeof(group),1,fin);
                                    fseek(fin,0,SEEK_SET);
                        p=0;
                                                        puts("s");
                                                        fclose(fin); 
                                                        exit(1);
                                                    }
                                        } 
                            }
 
                            //fseek(fin,2*sizeof(group),SEEK_SET);//   2 на третий кидает
                        case 2: {}  
                        case 3: {}
                        case 4: {}
                        case 5: {}
                        case 6: {}
                }
 
        }
Вот, всё тело функции...
1
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.03.2012, 23:00 4
удаляете запись - сдвигать нужно все последущие записи
0
Eugen-S
9 / 9 / 1
Регистрация: 06.11.2011
Сообщений: 122
09.03.2012, 23:50  [ТС] 5
я это понимаю, там дальше циклом бы сделал, но у меня не получается самое простое, записать запись номер 3 на место записи номер 2..

Добавлено через 33 минуты
спасибо всем кто читал тему. Подумал, проблема решилась. Беда была с режимом открытия файла..
0
09.03.2012, 23:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2012, 23:50

Определить количество строк в открытом файле
Здравствуйте, Форумчане. Напишите пожалуйста исходник. Мне нужно чтобы, 1. "программа открывала...

Как в открытом для чтения текстовом файле перейти к нужной строке?
Как в открытом для чтения текстовом файле перейти к нужной строке? Open 'Filename.txt' For...

Как получить номер(или какой нить индифиактор) текущей строки в открытом файле и перейти затем на эту строчку?
открываю файл так: ifstream input("morf.txt"); перехожу на следующие строчки так:...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru