2013-11-10 8 views
1

Этот код должен записать некоторые элементы в файл, но созданный файл имеет 0 байт и пуст. Я не совсем уверен, в чем проблема.Как записать файл произвольного доступа?

У меня нет никаких ошибок. Кроме того, может ли файл случайного доступа быть .txt или он должен быть .dat?

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

void add() 
{ 
int hour, min, day, month, yr, snum, interNo,age; 
string fname, lname, clinic, area, ex, li, type, sname, town, pay,problem, breed, gender; 
char ans; 
Intervention inte; 


fstream InfoFile("JSPCA.dat", ios::in | ios::out |ios::app); 
if (!InfoFile) 
{ 
    cout << "Error -file could not be opened."; 
} 
else 
{ 

    cout<<"Enter intervention number\n"; 
    ("Enter 0 to end input)\n"); 
    cin>>interNo; 
    system("cls"); 


    InfoFile.seekp(sizeof(Intervention)*(interNo - 1)); 
    /* read record from file*/ 
    InfoFile.read(reinterpret_cast<char *> (&inte), sizeof(Intervention)); 

    if (inte.getClient().getInterventionNo() != 0) 
    { 

     cout << "inter # already contains information.\n"; 
    } 
    else { 

     /* create record */ 
     while (interNo != 0) { 

      InfoFile.seekp(sizeof(Intervention)*(interNo - 1)); 

      InfoFile.read(reinterpret_cast<char *> (&inte), sizeof(Intervention)); 


      if (inte.getClient().getInterventionNo() != 0) 
       cout << "inter # already contains information.\n"; 
      else { 
       // user enters information, which is copied into file 
       cout << "Enter name of clinic(Winchester or Caymanas)\n "; 
       cin >> clinic; 
       cout << "Enter lastname, firstname\n "; 
       cin >> lname; 
       cin >> fname; 
       cout << "Please Address(Street#, Street Name, Town)\n"; 
       cin >> snum >> sname >> town; 
       cout << "Enter Contact#:(area exchange line)\n"; 
       cin >> area >> ex >> li; 
       cout << "Enter Animal Type\n"; 
       cin >> type; 
       cout << "Enter Animal Breed\n"; 
       cin >> breed; 
       cout << "Enter animal's gender\n"; 
       cin >> gender; 
       cout << "Enter Animal problem\n"; 
       cin >> problem; 
       cout << "Enter age of animal\n"; 
       cin >> age; 
       cout << "Please enter letter for payment type:\n"; 
       cout << "Full=F\n"; 
       cout << "Contribution=C\n"; 
       cout << "Can't Pay=CP\n"; 
       cin >> pay; 
       cout << "Enter date in format dd mm yyyy\n"; 
       cin >> day >> month >> yr; 
       cout << "Enter the time(hour minute\n)"; 
       cin >> hour >> min; 
       //inte.getClient().getInterventionNo() == interNo; 

       // set records for Client, address, TelNo, animal, date and time values 
       inte.setClient(Client(fname, lname, pay, interNo, clinic)); 
       inte.setAddress(Address(snum, sname, town)); 
       inte.setTelNo(TelNo(area, ex, li)); 
       inte.setAnimal(Animal(type, breed, gender, problem, age)); 
       inte.setDate(Date(day, month, yr)); 
       inte.setTime(Time(hour, min)); 



       InfoFile.seekp(sizeof(Intervention)*(interNo - 1)); 
       InfoFile.write(reinterpret_cast<const char *>(&inte), sizeof(Intervention)); 
      } 
      system("cls"); 
      cout << "Enter new intervention number\n"; 
      cout<<"Enter 0 to end input"; 
      cin >> interNo; 

     } 
     } 
} 

} 
+1

«У меня нет никаких ошибок». ... –

+0

Я имел в виду ошибки времени выполнения .. ничто не будет запускаться в файл – user2127184

ответ

2

Там, по крайней мере, три ошибки

1) Вы не можете сделать бинарный ввод/вывод, когда ваш объект содержит зЬй :: строку. Я предполагаю, что это так, вы не разместили определения объекта, который используете. Суть в том, что вы не должны просто предполагать, что вы можете делать двоичный ввод-вывод на что угодно. Вы должны понимать, какие объекты могут выводиться с использованием двоичного ввода-вывода. Я предполагаю, что твоя не может.

2) Если вы хотите сделать бинарный ввод/вывод необходимо открыть файл с с прошивкой :: бинарной

3) Именно по этой причине вы получите пустой файл. Если файл пуст (или не существует), то

InfoFile.read(reinterpret_cast<char *> (&inte), sizeof(Intervention)); 

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

Я думаю, что у вас есть кое-какие занятия по двоичному и произвольному доступу ввода/вывода. Это не слишком корректно.

+0

для той части, где u сказал, что файл пуст или не выходит ..do значит, мне нужно сначала записать пустые элементы в файл? – user2127184

+0

Нет, это не обязательно, но очевидно, что любая попытка чтения из пустого файла будет терпеть неудачу. Когда это произойдет, вы должны вызвать 'InfoFile.clear();', чтобы очистить ошибку, прежде чем пытаться что-либо сделать. Или вы можете просто изменить свой код, чтобы не пытаться читать из того места, которое не существует. Но, как я уже сказал, я думаю, что у вас больше проблем, чем в этом. – john

+0

Я наконец понял, как писать в файл .. – user2127184

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