Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 21.03.2011
Сообщений: 49

Не считывается последняя запись в файле

17.02.2013, 02:02. Показов 818. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане.
Нужна помощь, может кто-то свежим взглядом скажет, где ошибка или почему не считывается последняя запись в файле.
В самом начале в файл пишется 10к записей. Запись этих 10к элементов проходит нормально. Далее добавляются новые элементы по блочному методу доступа.
Размер блока 100 элементов.
Структура
C++
1
2
3
4
struct data{
    char val[33];
    int id;
};
Выполнение программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
f = fopen("fileForData", "w+b");
                data qq;
                int mas[100];
                for (int i = 0; i<10000; i++){
                    strcpy(qq.val,"type something here:... ");
                    qq.id = i;
                    fwrite(&qq, sizeof(data), 1, f);
                    listBox2->Items->Add(qq.id.ToString());
                }
                listBox1->Items->Add("Блочный");
                data qq1;
                bool ok = false;
                long pos = -1;
                long np = -1;
                srand(time(0));
                read = 0;
                write = 0;
                for (int i = 0; i<3; i++){
                    strcpy(qq.val,"type something here:... ");
                    qq1.id = 10100 - rand()%100 + 1;
                    mas[i] = qq1.id;
                    Badd(f, qq1, read, write);
                }
Функция добавления
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
void Badd(FILE *f, data el, int &wr, int &r){
    bool ok = false;
    data temp;
    long pos, pp;
    long tmpp = 0;
    long ptmpp = 0;
    Bfind(f, el.id, ok, r, pos, pp);
    if(pos == 0){
        fseek(f, pos, SEEK_SET);
        fwrite(&el, sizeof(data), 1, f);
        wr++;
    }else{
        fseek(f, sizeof(data), SEEK_END);
        ptmpp = ftell(f);
        tmpp = ptmpp - sizeof(data);
        while(ptmpp != pp){
            fseek(f, ptmpp, SEEK_SET);
            fread(&temp, sizeof(data), 1, f);
            r++;
            fwrite(&temp, sizeof(data), 1, f);
            wr++;
            ptmpp = tmpp;
            tmpp = tmpp - sizeof(data);
        }
        fseek(f, pos, SEEK_SET);
        fwrite(&el, sizeof(data), 1, f);
        wr++;
    }
}
Функция поиска
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
void Bfind(FILE *f, int key, bool &ok, int &r, long &pos, long &pp){
    data el;
    pos = 0;
    int l = 0; int h = 0;
    pp = -1;
    fseek(f, 0, SEEK_END);
    long ppp = ftell(f);
    if ( ppp == 0){ pos = 0;}
    else{
        fseek(f, 0, SEEK_SET);
        while(!feof(f)){
            fread(&el, sizeof(data), 1, f);
            r++;
            if (key > el.id){
                fseek(f,(B_SIZE - 1)*sizeof(data), SEEK_CUR);
            }else{
                if (key < el.id){
                h = ftell(f) - sizeof(data);
                l = h - B_SIZE*sizeof(data);
                while(l<=h){
                    fseek(f, l, SEEK_SET);
                    fread(&el, sizeof(data), 1, f);
                    r++;
                    if (el.id >= key){
                        ok = true;
                        pos = ftell(f) - sizeof(data);
                        pp = pos - sizeof(data);
                        break;
                    }
                    l = l + sizeof(data);
                }
                }else{
                if (key == el.id){
                ok = true;
                pos = ftell(f) - sizeof(data);
                pp = pos - sizeof(data);
                break;
                }
                }
            }
        }
        if (feof(f)){
            fseek(f, 0, SEEK_END);
            pos = ftell(f);
        }
    }
}
Спасибо за внимание.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2013, 02:02
Ответы с готовыми решениями:

Не считывается последняя строка таблицы
$db = mysql_connect(&quot;localhost&quot;,&quot;root&quot;,&quot;&quot;); mysql_select_db(&quot;Fraerov&quot;,$db); $query = mysql_query(&quot;SELECT `E-mail`,`Login` FROM...

Почему считывается только последняя строка?
Добрый день. Я написал программу, которая удаляет второе слово в каждой строке. Суть в том, что, когда она читает исходный файл, почему-то...

Работа с файлом: из файла считывается только последняя строка
По какой то причине считывает только последнею строку из файла. В чем проблема? #include &lt;stdio.h&gt; #define LEN 100 int...

6
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.02.2013, 09:43
По коду ничего сказать не могу, много всяких непонятностей, ибо я нуп =)
Но, логика:
Есть файл с N количеством строк(10 000 или нет - не важно). Сначала считаем количество строк в файле методом fgets, посчитали, создали динамический массив с кол-ом элементов который дал метод fgets, и заполнили массив структуры. Далее, мы сидим уже с сагруженным файлом, конешно fclose (так как был read). Теперь надо добавить что то, например через всякие EditBOX, тут вариант: создаём новый динамический массив с кол-вом эл-ов равное предыдущему +1, создали, перезаписали старые данные, добавили новую строку туда, удалили старый массив, приравняли имя к старому массиву (чтоб в последующих действиях всегда одно имя использовать), а методом записи "а" просто добавили новую строку в файл... Но можно сделать по другому, потому как 10 000 элементов это много и постоянно перезаписывать - накладно будет, можно без перезаписи просто все новые элементы пихать в новый массив (тогда будем изменять только новый массив добавленных эл-ов).
Честно я не знаю в этом ли был вопрос или нет, но лучше сделать так, чтоб наверняка знать кол-во строк в открываемом файле и всегда контролировать его.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
17.02.2013, 10:06
вот здесь что ты хотел сделать
Цитата Сообщение от flips Посмотреть сообщение
Функция добавления
Цитата Сообщение от flips Посмотреть сообщение
if(pos == 0){
* * * .........
* * }else{
* * * * fseek(f, sizeof(data), SEEK_END);
если pos не равно 0 то
установить указатель на конец файла + смещение на размер data т.е выходим за размер файла

ты так хочешь увеличить размер файла?
по моему так не сработает, запиши фиктивный блок
0
0 / 0 / 1
Регистрация: 21.03.2011
Сообщений: 49
17.02.2013, 14:55  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
вот здесь что ты хотел сделать
если pos не равно 0 то
установить указатель на конец файла + смещение на размер data т.е выходим за размер файла

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

запиши фиктивный блок
Т.е. для выполнения смещения в файле всегда должен быть один доп блок при добавлении?
Или как писали выше выполнить запись 10к структур, затем закрыть файл и открыть для дозаписи?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
17.02.2013, 15:37
Цитата Сообщение от flips Посмотреть сообщение
Сдесь я хотел вернутся на последнюю запись в файле.
тогда должен писать
C++
1
fseek(f, -sizeof(data), SEEK_END);
к началу отрицательные значения смещения
к концу положительные

Добавлено через 1 минуту
Цитата Сообщение от flips Посмотреть сообщение
Т.е. для выполнения смещения в файле всегда должен быть один доп блок при добавлении?
Или как писали выше выполнить запись 10к структур, затем закрыть файл и открыть для дозаписи?
я же не знаю что ты хочешь сделать
я подумал что ты в средину решил сделать вставку, а для этого нужно увеличить размер
1
0 / 0 / 1
Регистрация: 21.03.2011
Сообщений: 49
17.02.2013, 16:32  [ТС]
Забыл сказать одну вещь, файл получается отсортированный.
Функция поиска ищет место вставки, а затем в добавлении, если нужно выполняется смещение файла и на позицию, которую выдала функция поиска выполняется вставка. В итоге добавлятся может в средину, а может в конец или в начало.
Выполнять всё нужно в файле.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
17.02.2013, 20:34
Говорю же, делайте проще. Файл открыли - прочли, добавили в структуру, закрыли. Захотели добавить(в любую часть) - ввели данные и номер строки(и чтоб этот номер был в структуре), создали новую структуру, перезаписали значения с 0 до порядкового номера добавленной строки, и с номера добавленной по конец, удалили старую структуру, переименовали структуру, открыли файл перезаписали в файл новую структуру (просто с начала и до конца), а если нужно чтоб была дозапись быстрая, то seekset по байтам считать(незнаю насколько трудно считать таким способом).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.02.2013, 20:34
Помогаю со студенческими работами здесь

Дважды считывается одна запись?
Переношу данные из базы firebird в Mysql. Одна запись в результирующей таблице повторяется дважды. Код примерно такой: ...

Как сделать запись в реестр win7 64. В реестр попадает только последняя запись
Добрый вечер! Не могу сделать запись в реестр win7 64. Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine; ...

Запись в файл не происходит, информация считывается неверно (найти и исправить ошибки в коде)
Здравствуйте. Программа скомпилировалась, запускается, но плохо работает. Файл открывается, данные считываются, вручную информация...

Последняя запись
Помогите пож. разобраться c запросом! Необходимо найти в таблице последнюю запись с наличием буквы &quot;с&quot; в слове. Пробовал так:...

Последняя запись
Всем привет. Хочу сделать проверку на последнюю запись, то есть нажимаем на кнопку запись выводятся записи из бд по запросу. Но как только...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru