Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2011, 02:45   #1
olegarh94
 
Регистрация: 07.11.2011
Сообщений: 3
По умолчанию Создание и редактирование файла (построчно) в С

Дана задача - Создание базы данных студентов и построчное её редактирование по запросу с пред просмотром редактируемой строки.

У меня такая вот проблема : почему у меня выдает баг после заполнения файла перед его выводом на экран , почему у меня не работает функция strstr, которая ищет номер редактируемой строки, с последующим её выводом на экран и как реализовать замену старой строки на новую?

код программы :
PHP код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include <iostream>

using namespace std;
void main()
{
    
struct BD1
{
    
    
char fio [300];
    
char data [300];
    
char atestat [300];
    
char ykr [300];
    
int ID;
    
char matem[300];
    
char fiz[300];
    
char pidgot[300];
};
BD1 b;
int kilkisti;
                                
int sm;
FILE *baza;
baza=fopen("BD1.txt","r");
if (
baza==NULL)
{

                                
puts("Skilki studentiv");
                                

                                
scanf("%d",&kilkist);
                                
fflush(stdin);


                                
BD1*a=new BD1[kilkist];
                                

                                for(
i=0;i<kilkist;i++)
                                {
                                    
                                
puts("Nomer po spisky");
                                
scanf("%d",&(a+i)->ID);

                                
puts("FIO");
                                
gets((a+i)->fio);

                                
puts("Data narodzenna");
                                
gets((a+i)->data);

                                
puts("Matematuka");
                                
gets((a+i)->matem);

                                
puts("Fizika");
                                
gets((a+i)->fiz);

                                
puts("Ykr mova");
                                
gets((a+i)->ykr);

                                
puts("Atestat");
                                
gets((a+i)->atestat);

                                
puts("Dovuzivska pidgotovka");
                                
gets((a+i)->pidgot);
                                                                

                                
fflush(stdin);
                                }

                                
FILE *baza;
                                
baza=fopen("BD1.txt","w+b");
                                
                                
fwrite(a,sizeof(BD1),kilkist,baza);
                                
rewind(baza);
                                
sm=sizeof(BD1);

                                for(
i=0;i<kilkist;i++)
                                {
                                    
fread(&b,sizeof(BD1),1,baza);
    
                                    
fseek(baza,i*sm,SEEK_SET);
    
                                    
fwrite(&b,sizeof(BD1),1,baza);
    
                                    
fseek(baza,(i+1)*sm,SEEK_SET);
    
                                }
                                
rewind(baza);
}

//------------------------------------------------------------------------------------------------------
while(fread(&b,sizeof(BD1),1,baza))
{
printf("%d %s %s %s %s %s %s %s \n"b.IDb.fiob.datab.atestatb.ykrb.matem,b.fizb.pidgot);

}
//------------------------------------------------
char xint slong offset;
printf("vuberite deystvie:\n   R- redaktirovanie v - vuhid \n");
cin>>x;//scanf("%s",x);
cout<<x;//printf("%s",x);
if(x=='r')
{
    
cout<<"vvedite nomer redaktiryemou stroki\n";
    
cin>>s;

    
offset=sizeof(baza);
    
printf("\nResult:\n");
    
rewind(baza);

    
i=0;
    while ( !
feof(baza) )
    {
        
fseek(bazai*offset0);
            
fread(&bsizeof(BD1), 1baza);
        if ( (
strstr(b.ID,s) !=NULL) ) 
                
printf("%d %s %s %s %s %s %s %s \n"b.IDb.fiob.datab.atestatb.ykrb.matem,b.fizb.pidgot);

        
i++;
    }

}
if(
x=='v') exit(1);


fclose(baza);

olegarh94 вне форума Ответить с цитированием
Старый 21.12.2011, 09:54   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

сразу два момента:

1. Вот здесь ты память выделяешь:
Код:
BD1*a=new BD1[kilkist];
А где ты её освобождаешь? Утечка памяти.

2. Ты выделяешь память под kilkist элементов.
А чему равно это количество?

Где у тебя в программе есть строчка, которая инициализирует kilkist адекватным значением?
Код:
BD1*a=new BD1[kilkist];
3. Чему равно значение kilkist? Сколько итераций будит наматывать цикл?
Код:
for(i=0;i<kilkist;i++)

Дальше не всматривался. Но есть подозрение, что в твоём файле по итогу будит лежать не те данные, которые ожидались
_Bers вне форума Ответить с цитированием
Старый 21.12.2011, 12:03   #3
olegarh94
 
Регистрация: 07.11.2011
Сообщений: 3
По умолчанию

дописал в конец условия
Код:
if (baza==NULL)
освобождение памяти
Код:
delete[]a
от этого ничего не сменилось.
количество kilkist я ввожу из клавиатуры
Код:
puts("Skilki studentiv");
								

								scanf("%d",&kilkist);
когда вывожу на печать записанный файл, то оно все корректно выводит и записывает то что нужно .
Вопрос не в этом а в том почему strstr не работает а компилятор выдает ошибку "отсутствуют экземпляры перегруженная функция strstr "
olegarh94 вне форума Ответить с цитированием
Старый 21.12.2011, 12:16   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Посмотри, какие данные нужно кормить функции strstr:
http://www.cplusplus.com/reference/c...string/strstr/

И посмотри, какие данные ты сам ей скармливаешь.

int ID; int s;

То есть, функции, которая принимает на входе две строки, ты пытаешься скормить два числа. Зачем?

Попробуй сделать так:
Код:
while ( !feof(baza) ) 
    { 
        fseek(baza, i*offset, 0); 
            fread(&b, sizeof(BD1), 1, baza); 
        if ( b.ID!=s )  
                printf("%d %s %s %s %s %s %s %s \n", b.ID, b.fio, b.data, b.atestat, b.ykr, b.matem,b.fiz, b.pidgot); 

        i++; 
    }
Может заработает. Хотя я так и не понял, чего ты пытаешься добиться этим условием.
_Bers вне форума Ответить с цитированием
Старый 21.12.2011, 17:00   #5
olegarh94
 
Регистрация: 07.11.2011
Сообщений: 3
По умолчанию

Спасибо большое _Bers! впринцыпе заработало только я написал так :
Код:
while ( !feof(baza) ) 
    { 
       fseek(baza, i*offset, 0); 
           fread(&b, sizeof(BD1), 1, baza); 
        if ( b.ID==s )  
		{    printf("%d %s %s %s %s %s %s %s \n", b.ID, b.fio, b.data, b.atestat, b.ykr, b.matem,b.fiz, b.pidgot); break; }

        i++; 
    }
ибо оно печатало пока не закончит просмотр каждого элемента и получалось что оно печатало по 20 раз одно и тоже.

Теперь всплывает такой вопрос : можно объяснить какой принцип и как реализовать замен строки которую оно нашло ?? а то я даже не подозреваю как это сделать
olegarh94 вне форума Ответить с цитированием
Старый 21.12.2011, 17:22   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от olegarh94 Посмотреть сообщение
Теперь всплывает такой вопрос : можно объяснить какой принцип и как реализовать замен строки которую оно нашло ?? а то я даже не подозреваю как это сделать
Первое, и самое простое, что пришло в голову:

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

2. Все манипуляции с данными базы данных теперь происходят уже с массивом данных, который в памяти. Там мы можем что захотим поменять, удалить, добавить, и тд.

3. По требованию сохранить изменения базы - снова открываем файл, и перезаписываем его целиком тем, что у нас есть в памяти. После чего снова закрываем файл.

Работать с памятью удобнее и быстрее, чем мурыжить бинарник на HDD
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и редактирование текстового файла sasha0123 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 04.12.2010 00:00
VS/C++ считывание из файла построчно lbs Помощь студентам 0 06.06.2010 13:53
Чтение файла построчно aciiiD Компоненты Delphi 11 26.08.2009 16:36
Определения частоты пары соседних символов в каждой строке и формирования файла частот построчно ивт Паскаль, Turbo Pascal, PascalABC.NET 0 05.12.2008 20:09
Типизированные файлы.Создание, удаление, редактирование, сортировка записей типизированного файла.Паскаль Студент Шиза Помощь студентам 6 08.12.2007 13:41