2010-08-24 3 views
0

в C++ Я написал простую программу, которая принимает от 4 до 6 записей, а затем больше не принимает, когда авиакомпания_ино такая же i.e. 1? Исходный код:манипулирование файлами

#include<fstream.h> 
#include<conio.h> 
#include<dos.h> 
#include<string.h> 
#include<stdlib.h> 
#include<process.h> 
#include<stdio.h> 
int lno; 
struct airln {int airline_no,routeno,dep_time,arr_time; 
    char port_d[15],port_a[15],week_day[10]; }r2; 

class route 
{ 
public: 
    void getroute() 
    { 

     cout<<"\n\tRoute no.: "; 
     cin>>r2.routeno;cout<<"\n"; 
     cout<<"\tDay of Departure: "; 
     gets(r2.week_day);cout<<"\n"; 
       cout<<"\tAirport for departure: "; 
     gets(r2.port_d);cout<<"\t"; 
     cout<<"Departure Time: "; 
     cin>>r2.dep_time;cout<<"\n"; 
     cout<<"\tAirport for arrival: "; 
     gets(r2.port_a);cout<<"\t";   
       cout<<"Arrival Time: "; 
     cin>>r2.arr_time;cout<<"\n"; 
     cout<<"\n\tAirline no.: "; 
     cin>>r2.airline_no; 
    } 
    void display_route() 
    { 
    cout<<"\n Route No : ";cout<<r2.routeno; 
    cout<<"\n "; 
    cout<<r2.port_d;cout<<"\t"; 
    cout<<r2.dep_time;cout<<"\t\t"; 
    cout<<r2.port_a;cout<<"  \t"; 
    cout<<r2.arr_time;cout<<"\t\t"; 
    cout<<r2.week_day;cout<<"\n"; 
    } 
}r3; 
void main() 
{ 
    clrscr(); 
    int airlnno,rtnodel,cntr; 
    char airlinename[30]; 
    ifstream fin,fin1; 
    ofstream fout; 

    do 
    { 
    cout<<"\t1. Insert Data.\n"; 
    cout<<"\t2. View Data.\n"; 
    cout<<"\t3. Exit.\n"; 
    cout>>"\tEnter Choice : ";cin>>cntr; 
    switch(cntr) 
    { 

      case 1:r3.getroute(); 
        fout.open("testdata.dat",ios::app); 
        if(!fout) 
        { 
         gotoxy(25,10); 
         cout<<"No file exists or file can\'t be opened\n"; 
         gotoxy(25,22); 
         cout<<"Please Press Any Key to Continue......."; 
         getch(); 
         clrscr(); 
         } 
        fout.write((char *) &r2,sizeof(r2)); 
        fout.close(); 
        clrscr(); 
        break; 
     case 2:fin.open("testdata.dat",ios::in); 
       if(!fin) 
       { 
       gotoxy(25,20); 
       cout<<"No file exists or file can\'t be opened\n"; 
       gotoxy(25,22); 
       cout<<"Please Press Any Key to Continue......."; 
       getch(); 
       clrscr(); 
       break; 
       } 
       cout<<"\n Dep-Airport\t"; 
       cout<<"Dep-Time\t"; 
       cout<<"Arr-Airport\t"; 
       cout<<"Arr-Time\t"; 
       cout<<"Week Day\n"; 
       fin.read((char *) &r2,sizeof(r2)); 
       while(!fin.eof()) 
       { 
      r3.display_route(); 
      fin.read((char *) &r2,sizeof(r2)); 
       } 
       fin.close(); 
       gotoxy(25,22); 
       cout<<"Please Press Any Key to Continue......."; 
       getch(); 
       clrscr(); 
       } 
       } while(!(cntr==3)); 
} 
+1

Вы можете переформатировать код, чтобы он читается с помощью блока кода «», и вы также можете добавить «домашнее задание» тег в тегах. – jacknad

+1

Ваш код очень неясен. Назовите свои переменные правильно. Правильно используйте новые строки в коде. Кроме того, вы должны отказаться от зависимостей dos.h и conio.h (избавиться от операторов clrscr и gotoxy в вашем коде) сначала получить функциональность, работающую только тогда, чтобы работать над представлением вывода. –

+1

Почему void main()? Это должно быть int. http://stackoverflow.com/questions/204476/what-should-main-return-in-c-c – DumbCoder

ответ

0

Нужно ли вам использовать файлы для этого? Вы всегда можете использовать std :: map и держать air_no в качестве ключа.

Я бы также избегал использования глобальной структуры и класса.

Редактировать: k, У меня проблема, и выяснилось, что проблема 1050. Я могу перенести его на более раннюю запись, и она тоже остановится. Я думаю, проблема в том, что 1050 как-то запускает End of File. Попробуйте следующие замены строк, чтобы открыть файл в двоичном виде:

fout.open("testdata.dat",ios::app | ios::binary); 
fin.open("testdata.dat",ios::in | ios::binary); 

вместо:

fout.open("testdata.dat",ios::app); 
fin.open("testdata.dat",ios::in); 

Edit: Просто был чек и 1050 преобразует в 041A, который переводит на символы конца передачи и затем .... SUB или EOF. Я думаю, что это ваша проблема и в двоичном режиме это не должно быть проблемой.

+0

Просьба указать причину, почему это происходит, т. Е. После 4 записей, почему он не принимает больше> –

+2

Каковы ваши данные теста? Как это «прекратить принимать»? Сбой? Подвешивание? Какая-то трясущая головой? –

+0

После удаления некоторых бит, чтобы заставить его работать на моем компьютере, он счастливо побежал более 4 раз. Кроме того, не следует «cout >>» \ tEnter Choice: "; cin >> cntr;" быть "cout << ..."? –

0

Вам необходимо очистить cin после получения каждого входа каждый раз. Вероятно, в начале do while loop. Значение cntr может быть взято из ранее введенных значений. Если это будет 3, он выходит из цикла while, а не принимает никаких последующих записей.

Попробуйте cin.clear() или cin.ignore() в начале цикла while.

Вы можете обратиться How do I flush the cin buffer?

+0

Извините, я не смог объяснить проблему. То, что я спросил, было в файле. Testdata.dat запись не может быть написана более 4 раз с той же авиакомпанией_и_. Хотя в койке 1 кода не отображается какая-либо ошибка, создающая впечатление, что данные были записаны, но когда используется койка 2 для отображения, отображается только 4 записи. Пожалуйста, помогите понять. Мои данные испытаний: 1010, Нью-Дели, 1000, Мумбаи, 1200, Все дни, 1; 1020, Нью-Дели, 1000, Мумбаи, 1200, Все дни, 1; 1030, Нью-Дели, 1000, Мумбаи, 1200, Все дни, 1; 1040, Нью-Дели, 1000, Мумбаи, 1200, Все дни, 1; 1050, Нью-Дели, 1000, Мумбаи, 1200, Все дни, 1; –

+0

Я не могу ввести входные данные. Некоторые поля пропускаются из-за символов, присутствующих во входном потоке cin. – bjskishore123

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