argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Файлове в Dev С++  (Прочетена 6077 пъти)

neli_randewa

  • Неактивен Неактивен
  • Публикации: 5
Re:Файлове в Dev С++
« Отговор #20 -: 27.04.2012, 16:11:51 »

Здравейте!
И аз имам прблем. ГОЛЯМ! ПОМОГНЕТЕ МИ?
Искам да направя информационна ситема, която работи с файлове, чийто елементи са структура. Про извеждането на елементите на файла винаги последния ми го отпечатва два пъти.Успях да добавя елемент, но не мога да промена даден елемент. Дава ми грешка при функцията seekp! Ако се справя с това вероятно ще успея и да изтрий елемент от файла.
#include<iostream.h>
#include<fstream.h>
struct uchenik
{unsigned nom;
char ime[20];
char egn[11];
float usp;
 }u;
int is;



/*void append();
void update();
void choose();
void del();
*/
void create ()
 {  ofstream f;
    f.open("klas.dat",ios::out);
    if (!f) {cout<<"Error"<<"\n";
     system("pause");
     return ;}
    int n=-1, is;
    while (n!=0)
      {cout<<"Nomer: "; cin>>u.nom;
   cout<<"Ime: ";cin>>u.ime;
   cout<<"EGN: "; cin>>u.egn;
   cout<<"Uspeh: "; cin>>u.usp;
    f.write((const char*)&u,sizeof(struct uchenik));
    cout<<"Nov zapis: 1-da,0-ne"<<"\n";
    cin>>n; }
    f.close();
}
void print()
{    ifstream f;
     f.open("klas.dat",ios::in);
    if (!f) {cout<<"Error"<<"\n";
     system("pause");
     return ;}
     do
      {f.read((char*)&u,sizeof(struct uchenik));
      cout<<"Nomer: "<<u.nom<<endl;
     cout<<"Ime: "<<u.ime<<endl;
     cout<<"EGN: "<<u.egn<<endl;
     cout<<"Uspeh: "<<u.usp<<endl<<endl;
      }
       while (!f.eof());
    f.close();
}
void append()
{    ofstream f;
     f.open("klas.dat",ios::app);
     /*if (!f) {cout<<"Error"<<"\n";
     system("pause");
     return ;}*/
     int n=-1;
    while (n!=0)
    {cout<<"Nomer: "; cin>>u.nom;
   cout<<"Ime: ";cin>>u.ime;
   cout<<"EGN: "; cin>>u.egn;
   cout<<"Uspeh: "; cin>>u.usp;
    f.write((const char*)&u,sizeof(struct uchenik));
    cout<<"Nov zapis: 1-da,0-ne"<<"\n";
    cin>>n; }
    f.close();
 }
void update()
 {unsigned long pos;
      fstream f;
      f.open("klas.dat",ios::in|ios::ate|ios::binary);
 unsigned  search_nom;
 float ocenka;
 cout<<"Vyvedi tyrseniq nomer: ";cin>>search_nom;
 cout<<"Vyvedi nova ocenka: ";cin>>ocenka;
 //if (!f) {cout<<"Error"<<"\n";
  //   system("pause");
    // return ;}
      while (f)
      {f.read((char*)&u,sizeof(struct uchenik));
      if(u.nom==search_nom)
      {pos=f.tellg()-sizeof(struct uchenik);
      f.seekp(pos);
      u.usp=ocenka;
      f.write((const char*)&u,sizeof(struct uchenik));
      }
      }
          f.close();
 
  }
int main()
{ int op=-1;
while (op!=0)
  {cout<<"izberete funciq:"<<endl;
   cout<<"     1-sazdavane na fail\n"<<endl;
   cout<<"     2-izvejdane na fail\n"<<endl;
   cout<<"     3-dobavqne na u4enik\n"<<endl;
   cout<<"     4-promqna na ocenka\n"<<endl;
   cout<<"     5-izbor po uspeh\n"<<endl;
   cout<<"     6-iztrivane\n"<<endl;
   cout<<"vsi4ko drugo-krai\n"<<endl;
   cin>>op;
    switch (op)
    { case 1: create();break;
      case 2:print();break;
      case 3:append();break;
     /*case 4:update();break;
      case 5:choose();break;
      case 6:del();break;*/
     default:exit(0); }
     }   
  system("PAUSE");   
  return 0;
}
Активен

lamerko

  • Неактивен Неактивен
  • Публикации: 211
    • Моят блог
Re:Файлове в Dev С++
« Отговор #21 -: 28.04.2012, 13:26:33 »

Здрасти. Сега ставам и не ми се гледа много сорса, но на пръв поглед ми направи впечатлението, че използваш параметър на seekp() от типа на tellg(). Пробвай комбинацията seek/tell да са от един тип - например за двоични файлове да са seekg() и tellg().
Активен

neli_randewa

  • Неактивен Неактивен
  • Публикации: 5
Re:Файлове в Dev С++
« Отговор #22 -: 29.04.2012, 08:21:25 »

Благодаря!
Но на мен целта ми е като чета от файла и намеря елемент, който отговаря на някакво условие да се върна снимка назад и да презапиша в-у този елемент, т. е едновременно искам да чета и пиша във файла.
Незнам, трябва да се справя.
Активен

Светослав Енков

  • Неактивен Неактивен
  • Публикации: 1864
    • Shark's Home Page
Re:Файлове в Dev С++
« Отговор #23 -: 29.04.2012, 10:20:26 »

Да де, ама ....g и ....p работят с различни буфери и може да са в различен режим. Мисля, че ти пратих някакъв готов пример, не тръгна ли?

В http://en.wikipedia.org/wiki/Data_file - File pointers and random access - казват, че двата указателя са равни, ако е fstream. Така че бъркаш нещо дребно, но принципно.

И още - обхождане се прави с while (), не с do while (), защото може файлът да е празен. Също така, добър подход е след всяка операция read/write/seek да се прави проверка за грешка. Но за конкретният ти въпрос е друг проблема. Всъщност, трябва да си кача devC++ и да ти го компилирам и дебъгна, за да хвана проблема, защото на пръв поглед е ок.

А, да - и желателно е да има винаги и ios::binary

File streams opened in binary mode perform input and output operations independently of any format considerations. Non-binary files are known as text files, and some translations may occur due to formatting of some special characters (like newline and carriage return characters).

Виж и тук секцията Binary files http://www.cplusplus.com/doc/tutorial/files/
« Последна редакция: 29.04.2012, 11:26:43 от Светослав Енков »
Активен

neli_randewa

  • Неактивен Неактивен
  • Публикации: 5
Re:Файлове в Dev С++
« Отговор #24 -: 29.04.2012, 20:42:28 »

Благодаря и за тези съвети!
По-късно ще изпробвам!
Ако успея с нещо ще пиша!
Благодаря още веднъж!
Активен

neli_randewa

  • Неактивен Неактивен
  • Публикации: 5
Re:Файлове в Dev С++
« Отговор #25 -: 29.04.2012, 21:27:33 »

А що се отнася за цикъла do-while. Да така е, той е останал, защото имах проблеми с отпечатването на файла. Последния елемент ми го печаташе винаги два пъти. Този проблем го оправих. Ето кода - в него работят create, print и append.
#include <iostream>
#include <fstream>
#include <fcntl.h>
using namespace std;

struct uchenik
{unsigned nom;
char ime[20];
char egn[11];
float usp;
 }u;
int is;



/*void append();
void update();
void choose();
void del();
*/
void create ()
 {  ofstream f;
    f.open("klas.dat",ios::out);
    if (!f) {cout<<"Error"<<"\n";
     system("pause");
     return ;}
    int n=-1, is;
    while (n!=0)
      {cout<<"Nomer: "; cin>>u.nom;
   cout<<"Ime: ";cin>>u.ime;
   cout<<"EGN: "; cin>>u.egn;
   cout<<"Uspeh: "; cin>>u.usp;
    f.write((const char*)&u,sizeof(struct uchenik));
    cout<<"Nov zapis: 1-da,0-ne"<<"\n";
    cin>>n; }
    f.close();
}
void print()
{    ifstream f;
     f.open("klas.dat",ios::in);
    if (!f) {cout<<"Error"<<"\n";
     system("pause");
     return ;}
   while (!f.eof())
      {if(!(f.read((char*)&u,sizeof(struct uchenik))))break;
     
      cout<<"Nomer: "<<u.nom<<endl;
     cout<<"Ime: "<<u.ime<<endl;
     cout<<"EGN: "<<u.egn<<endl;
     cout<<"Uspeh: "<<u.usp<<endl<<endl;
      }
     
    f.close();
}
void append()
{    ofstream f;
     f.open("klas.dat",ios::app);
     if (!f) {cout<<"Error"<<"\n";
     system("pause");
     return ;}
     int n=-1;
    while (n!=0)
    {cout<<"Nomer: "; cin>>u.nom;
   cout<<"Ime: ";cin>>u.ime;
   cout<<"EGN: "; cin>>u.egn;
   cout<<"Uspeh: "; cin>>u.usp;
    f.write((const char*)&u,sizeof(struct uchenik));
    cout<<"Nov zapis: 1-da,0-ne"<<"\n";
    cin>>n; }
    f.close();
 }
void update()
 {unsigned long pos;
      fstream f;
      f.open("klas.dat",ios::in|ios::ate|ios::binary);
 unsigned  search_nom;
 float ocenka;
 cout<<"Vyvedi tyrseniq nomer: ";cin>>search_nom;
 cout<<"Vyvedi nova ocenka: ";cin>>ocenka;
 if (!f) {cout<<"Error"<<"\n";
     system("pause");
    return ;}
      while (!f.eof())
      {f.read((char*)&u,sizeof(struct uchenik));
      if(u.nom==search_nom)
      {
                            pos=f.tellp()-sizeof(struct uchenik);
                            cout << pos << endl;
      f.seekp(pos,ios::beg   );
      u.usp=ocenka;
      f.write((const char*)&u,sizeof(struct uchenik));
      }
      }
          f.close();
 
  }
int main()
{ int op=-1;
while (op!=0)
  {cout<<"izberete funciq:"<<endl;
   cout<<"     1-sazdavane na fail\n"<<endl;
   cout<<"     2-izvejdane na fail\n"<<endl;
   cout<<"     3-dobavqne na u4enik\n"<<endl;
   cout<<"     4-promqna na ocenka\n"<<endl;
   cout<<"     5-izbor po uspeh\n"<<endl;
   cout<<"     6-iztrivane\n"<<endl;
   cout<<"vsi4ko drugo-krai\n"<<endl;
   cin>>op;
    switch (op)
    { case 1: create();break;
      case 2:print();break;
      case 3:append();break;
      /*case 4:update();break;
      case 5:choose();break;
      case 6:del();break;*/
     default:exit(0); }
     }   
  system("PAUSE");   
  return 0;
}
Активен