2013-03-17 8 views
0

код выглядит следующим образомОшибка при обработке файла C++

ofstream f("bank.dat", ios::app); 
ifstream fa("bank.dat"); 
int n = 0, flag = 0; 
struct bac 
{ 
    char name[10]; 
    char amt[5]; 
} s; 

void add() 
{ 
    cout << "\nenter the details "; 
    cin >> s.name >> s.amt; 
    f.write((char *)&s, sizeof(bac)); 

} 

void ser() 
{ 
    ifstream fa("bank.dat"); 
    fa.seekg(0); 
    char x[10]; 
    cout << "\nenter value to be searched "; 
    cin >> x; 

    while (fa && flag == 0) 
    { 
     n++; 
     fa.read((char *)&s, sizeof(bac)); 
     if (strcmp(s.name, x) == 0) 
     { 
      flag = 1; 
      break; 
     } 
    } 
    if (flag == 1) 
    { 
     cout << "\nfound"; 
     cout << "\nAmount " << s.amt; 
    } 


} 

void mod() 
{ 
    ser(); 
    cout<<" "<<n; 
    if (flag == 1) 
    { 
     f.seekp((n - 1) * sizeof(bac)); 
    // cout<<f.tellp(); 
     cout<<"\nnew details "; 
     add(); 
    } 
} 


int main() 
{f.seekp(0); 
    int ch; 

     cout << "\nBANK MANAGEMENT SYSTEM \n"; 
     cout << "enter choice "; 
     cout << "\n1.add\n2.search\n3.delete and overwrite "; 
     cin >> ch; 
     if (ch == 1) 
     { 
      add(); 
     } 
     if (ch == 2) 
     { 
      ser(); 
     } 
     if (ch == 3) 
     { 
      mod(); 
     } 

    return 0; 
} 

То, что я пытаюсь сделать, это сделать программу с поиска, отображения и изменения функций;

ОШИБКА

Запись добавляемый в последней, даже когда я использую

f.seekp((n - 1) * sizeof(bac)); 

ОПЕРАЦИИ ВЫПОЛНЕНО

* добавить SID, сар по имени записи с АМТС 5 , 6 соответственно

* заменить с.и.д. поименованной записи с именем: SID (такой же, как оригинал) амт: 7

РЕЗУЛьТАТ В ФАЙЛ

ОЖИДАЕМЫЕ с.и.д. 7 сар 6

НАЙДЕНО с.и.д. 5 sar 6 sid 7

ответ

1

Я думаю, это потому, что вы используете флаг ios :: app.

Как написано here:

app: (append) Set the stream's position indicator to the end of the stream before each output operation. 
+0

hmmm u r right ... но сменив его на ios :: ate или оставив его пустым, не делает трюка !! –

+1

Я думаю, вы должны оставить его пустым и поместить курсор записи в конец потока в свой метод 'add' –

+0

thnx, ok я попробую –

1

Повторно инициализировать 'n = 0' в начале операции ser(). В настоящее время вы продолжаете увеличивать «n» каждый раз, когда вызывается запрос, и вот почему запись добавляется в конец файла. Я бы посоветовал не использовать глобальные vars 'n' и 'flag', а скорее возвращать эти значения, например.

int ser() 
{ 
    // return n if search succeeds else return '-1'. 
} 

Я вижу, что это может быть улучшено различными способами, возможно, взгляните на пример кода на IO в стандартной книге.

+0

Thnx за советы, я буду смотреть на него !! –

Смежные вопросы