проблема при записи в файл - PullRequest
0 голосов
/ 16 апреля 2011

Ребята, я написал следующий код для реализации телефонной книги на С ++ Что я делаю, так это сначала беру данные из трех файлов, содержащих имена, адрес и номер телефона (вы не можете посмотреть весь код), просто посмотрите внизу

Теперь я даю пользователю добавить контакты для добавления во время выполнения, и эти значения хранятся в классе. Теперь я стираю файлы, содержащие имена, адреса и номера, и записываю в них новые данные с использованием ofstream, которые будут извлечены, когда пользователь снова запустит «телефонную книгу»

однако я не могу увидеть какие-либо входные данные в файлах после однократного запуска программы, и я добавил несколько значений во время выполнения. Кто-нибудь может мне помочь? Заранее спасибо

    #include<iostream>//Include Header Files   
    #include<cstdlib>
    #include<fstream>
    #include<string>
    using namespace std;

    class contact{

    public:

         string name;//ALL CLASS VARIABLES ARE PUBLIC

         int phonenumber;

         string address;

         contact(){//Constructor

         name= "Noname";

         phonenumber= 0;

         address= "Noaddress";

    }


    };

    int main(){

         contact *d;

         d= new contact[200];

         string name,add;

         int choice,modchoice,k=0;//Variable for switch statement

         int phno,phno1;

         int i=0;
         int initsize=0, i1=0;//i is declared as a static int variable

         bool flag=false,flag_no_blank=false;


         //TAKE DATA FROM FILES.....
         //We create 3 files names, phone numbers, Address and then abstract the data from these files first!

         fstream f1;
         fstream f2;
         fstream f3;

         string file_input_name; 
         string file_input_address;

         int file_input_number;


         f1.open("./names");

         while(f1>>file_input_name){

              d[i].name=file_input_name;

              i++;

         }
         initsize=i;

         f2.open("./numbers");

         while(f2>>file_input_number){

              d[i1].phonenumber=file_input_number;
              i1++;

         }

         i1=0;


         f3.open("./address");

         while(f3>>file_input_address){

              d[i1].address=file_input_address;

              i1++;

         }





         cout<<"\tWelcome to the phone Directory\n";//Welcome Message
         do{    
              //do-While Loop Starts
              cout<<"Select :\n1.Add New Contact\n2.Update Existing Contact\n3.Display All Contacts\n4.Search for a Contact\n5.Delete a  Contact\n6.Exit PhoneBook\n\n\n";//Display all options


              cin>>choice;//Input Choice from user



              switch(choice){//Switch Loop Starts

              case 1:{

                   i++;//increment i so that values are now taken from the program and stored as different variables 
                   i1++;

               do{

                        cout<<"\nEnter The Name\n";

                cin>>name;

                if(name==" "){cout<<"Blank Entries are not allowed";
                                 flag_no_blank=true;

                }

               }while(flag_no_blank==true);


                   flag_no_blank=false;



               d[i].name=name;

               cout<<"\nEnter the Phone Number\n";

                   cin>>phno;

                   d[i1].phonenumber=phno;



               cout<<"\nEnter the address\n";


                   cin>>add;

                   d[i1].address=add;

               i1++;

                   i++;

                   break;//Exit Case 1 to the main menu
              }

              case 2:   {

                   cout<<"\nEnter the name\n";//Here it is assumed that no two contacts can have same contact number or address but may have the same name.

               cin>>name;

               int k=0,val;

               cout<<"\n\nSearching.........\n\n";

               for(int j=0;j<=i;j++){


                    if(d[j].name==name){

                     k++;           

                     cout<<k<<".\t"<<d[j].name<<"\t"<<d[j].phonenumber<<"\t"<<d[j].address<<"\n\n";

                     val=j;                 

                     }

                 }


                 char ch;

                 cout<<"\nTotal of "<<k<<" Entries were found....Do you wish to edit?\n";

                 string staticname;

                 staticname=d[val].name;

                 cin>>ch;

                 if(ch=='y'|| ch=='Y'){

                      cout<<"Which entry do you wish to modify ?(enter the old telephone number)\n";

                      cin>>phno;

                  for(int j=0;j<=i;j++){

                       if(d[j].phonenumber==phno && staticname==d[j].name){

                            cout<<"Do you wish to change the name?\n";

                        cin>>ch;

                            if(ch=='y'||ch=='Y'){

                             cout<<"Enter new name\n";

                         cin>>name;

                         d[j].name=name;

                        }

                        cout<<"Do you wish to change the number?\n";

                            cin>>ch;

                        if(ch=='y'||ch=='Y'){

                             cout<<"Enter the new number\n";

                         cin>>phno1;

                         d[j].phonenumber=phno1;

                         }

                                     cout<<"Do you wish to change the address?\n";

                         cin>>ch;

                         if(ch=='y'||ch=='Y'){

                              cout<<"Enter the new address\n";

                          cin>>add;

                          d[j].address=add;

                         }

                        }               

                   }

                      }

                      break;

                 }

             case 3 : {

                  cout<<"\n\tContents of PhoneBook:\n\n\tNames\tNumbers\tAddresses\n";

                  for(int t=0;t<=i;t++){

                       if(d[t].name=="Noname") continue;

                       cout<<".\t"<<d[t].name<<"\t"<<d[t].phonenumber<<"\t"<<d[t].address<<"\n";

                  }

                      cout<<"\n\n\n\n";

                  break;

                 }

             case 4:{
                  cout<<"Enter a name to search\n";

                  cin>>name;

                      cout<<"\n\nSearching.........\n\n";

                  for(int j=0;j<=i;j++){

                      if(d[j].name==name){

                       k++;         

                   cout<<k<<".\t"<<d[j].name<<"\t"<<d[j].phonenumber<<"\t"<<d[j].address<<"\n\n";

                   int val=j;                   

                  }

             }

             cout<<"\nA total of "<<k<<" contact names were found having the name"<<name;

             break;
            }
            case 6:{

                 cout<<"\n\nClosing the phonebook...Visit Again\n";

             flag=true;

                 break;

            }

            case 5: {

                 cout<<"\nEnter the contact-name\n";//Here it is assumed that no two contacts can have same contact number or address but may have the same name.

             cin>>name;

             int k=0,val;

             cout<<"\n\nSearching.........\n\n";

             for(int j=0;j<=i;j++){

                      if(d[j].name==name){
                       k++;         

                   cout<<k<<".\t"<<d[j].name<<"\t"<<d[j].phonenumber<<"\t"<<d[j].address<<"\n\n";
                                                                                      val=j;                    

                  }

             }


             char ch;

             cout<<"\nTotal of "<<k<<" Entries were found....Do you wish to delete?\n";

             if(k==0) break;

             string staticname;

             staticname=d[val].name;

             cin>>ch;

             if(ch=='y'|| ch=='Y'){

                  cout<<"Which entry do you wish to delete ?(enter the old telephone number)\n";

                  cin>>phno;

                  for(int j=0;j<=i;j++){

                       if(d[j].phonenumber==phno && staticname==d[j].name){

                                val=j;                  

                   }

                      }

                      for(int j=val;j<=i-1;j++){

                           d[j].name=d[j+1].name;


                           d[j].phonenumber=d[j+1].phonenumber;


                           d[j].address=d[j+1].address;

                      }

                      d[i].name="Noname";


                      d[i].phonenumber=0;


                      d[i].address="Noaddress";

                 }


                 break;

            }

       }
  }


  while(flag==false);

  std::ofstream f4("./names");

  f4.close();

  std::ofstream f5("./numbers");

  f5.close();

  std::ofstream f6("./address");

  f6.close();

  f1.close();

  f2.close();

  f3.close();

  ofstream f7,f8,f9;

  f7.open("names");

  f8.open("numbers");

  f9.open("address");
  int y=0;

  string w;

  w=d[0].name;

  while(f7<<w && y<=i){

  if(w=="Noname") y++; continue;

  y++;

  w=d[y].name;

  }

  y=0;
  int v;
  v=d[0].phonenumber;
  while(f8<<v && y<=i){
       if(v==0){y++; continue;}
       y++;
       v=d[y].phonenumber;
  }

  y=0;

  string u;
  u=d[0].address;

  while(f9<<u && y<=i ){

       if(u=="Noaddress"){

            continue;
            y++;
       }

       y++;

       u=d[y].address;

  }

  return 0;

  }     

Ответы [ 4 ]

2 голосов
/ 16 апреля 2011

Я понимаю, почему ты расстроен, кодер.Это разочаровывающий код.

while (flag == false) (согласно комментарию Джонатана это не так явно плохо, как казалось. Это все еще плохо, что этодаже трудно судить о настоящем барахле из остальной части беспорядка ... :) 1006

1008 * WTF?Просто не нажимайте «6», чтобы выйти, или вы будете жарить свой процессор бесплатно

Он все еще сжигал 100% процессора и в любом случае заполнял / tmp в опасном темпе.Я думаю, это не называется бесконечным циклом (потому что он завершается, как только файловая система заполнена).Слава богу, / tmp находится на tmpfs (размер 4g), и у меня есть 8 г оперативной памяти:)

Хранение имен, номеров и адресов в отдельных файлах ... хм, вероятно, хорошая идея.

Один тестовый запуск у меня было написано 3.7G для адреса :) ("NoaddressNoaddressNoaddressNoaddressNo ....") Просто приятно, чтобы это вылетало, потому что при загрузке буфер для приема адреса (очевидно, называется d)это точно 200 записей.

Честно говоря, этот код должен перейти в TheDailyWTF.Pronto Pronto!

Этот код не может быть исправлен.Период

2 голосов
/ 16 апреля 2011

кстати.

while(f7<<w && y<=i){
    if(w=="Noname") 
        y++;          // <- proper indention is king
    continue;
    y++;              // <- never reached
    w=d[y].name;      // <- never reached
}

while(f8<<v && y<=i){
    if(v==0) {
        y++; 
        continue;
    }
    y++;
    v=d[y].phonenumber;
}

while(f9<<u && y<=i ){
    if(u=="Noaddress") {
        continue;
        y++;         // <- never reached
    }
    y++;
    u=d[y].address;
}
2 голосов
/ 16 апреля 2011

C ++ автоматически обрабатывает ошибки ввода-вывода? Психически? Если нет, то где ваши обработчики ошибок? Просто спрашиваешь.

РЕДАКТИРОВАТЬ в ответ на комментарий ОП: Да, я понимаю, но обычно, если данные не записываются в файл, файловая система возвращает код ошибки, который пытается сообщить вам почему не было написано. Но вы решили игнорировать то, что говорила файловая система. Мой вопрос, на который я надеялся дать вам подсказку, должен был звучать так:

"Если вы не проверите коды возврата file-write-call, у вас будет хороший, долгий поход, пытаясь отладить вашу программу. Пожалуйста, проверьте эти коды возврата ошибок и сообщите нам, какие они есть. Это стандарт и требуемая практика программирования, в конце концов, и если вы не следуете стандартной, требуемой практике, тогда ваша единственная надежда - проконсультироваться с цыганской гадалкой на углу.

«ТАК: какие коды возвращаются при каждом вызове файлового ввода-вывода?»

Попробуйте и расскажите нам больше. И спасибо за отрицательный голос: мне это нужно.

0 голосов
/ 16 апреля 2011

Есть много вещей, которые не так с этой программой.Давайте попробуем исправить некоторые из них для начала, а затем основываться на этом.

Во-первых, как выглядит имя?У него есть пробел, например, «Фред Джонс» или, может быть, запятая, как «Джонс, Фред».Может быть, многие части, как "Чан Конг Санг".

Если вы разрешаете пробелы, вы не можете прочитать их с помощью «<<».Возможно, вы можете поместить одно имя в строку и прочитать его с помощью getline (). </p>

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

...