0

ファイルを操作する C++ アプリケーションを作成しています。ファイルの書き込みと読み取り、いくつかの検索機能などの標準操作を実装しました。

いくつかの操作を行った後、出力文字列が非常に奇妙な形になります。たとえば、テキスト "Address -" は "?п&&..&" のようになります。

ここに画像の説明を入力

ここに画像の説明を入力

ファイル操作によっていっぱいになる可能性のあるバッファがC++にあり、この出力を行っているので、空にするかクリーンアップする必要がありますか?

編集:ファイルからレコードを読み取り、ユーザー基準のためにそれらのいくつかを選択してから並べ替える関数を作成すると、問題が発生しました。

これが私のコードです:

構造:

    struct Appartament
    {
         char address[50];
         char telephoneNumber[20];
         char view[10];

         double price;
         double distanceFromCenter;

         int roomCount;
     };

ファイルを操作する関数:

    //Search by room count and order by price (rising)
    void AdvanceSearch()
    {
        clrscr();

        Appartament currentRecord;
        int recordsCount=0;

        fstream currentFile("Records.dat",ios::binary|ios::in);

        if(!currentFile)
        {
            cout<<"Error - the file could not be opened."<<endl;
            return;
        }
        else
        {
            //Array with apartments records
            Appartament CurrentRecords[MaxRecords];

            currentFile.seekg(0L,ios::end);
            long int length=currentFile.tellg();
            currentFile.seekg(0L,ios::beg);

            int isAppartamentFound=0;

            if(length==0)
            {
                cout<<"The file is empty."<<endl;
                return;
            }
            else
            {
                int userRoomCount;

                do
                {
                    clrscr();
                    cout<<"Enter apartment room count - ";
                    cin>>userRoomCount;
                }while(userRoomCount<0);

                clrscr();

                cout<<endl<<"Apartments with "<<userRoomCount<<" rooms order by price:";

                currentFile.read((char*)(&currentRecord),sizeof(Appartament));

                while(!currentFile.eof())
                {
                    if(currentRecord.roomCount==userRoomCount)
                    {
                        CurrentRecords[recordsCount]=currentRecord;
                        recordsCount++;
                        isAppartamentFound=1;
                    }

                    currentFile.read((char*)(&currentRecord),sizeof(Appartament));
                }

                currentFile.close();
            }

            if(isAppartamentFound==0)
            {
                cout<<endl<<"There are no matches!"<<endl;
            }
            else
            {
                //If only one apartment is found
                if(recordsCount==1)
                {
                    cout<<endl;
                    ShowRecord(currentRecord);

                }
                else
                {
                    //Sort the records

                    Appartament tempApartament;

                    int isChangeMade=1;

                    for(int index=0;index<recordsCount;index++){

                          //ShowRecord(CurrentRecords[index]);
                    }

                    while(isChangeMade==1)
                    {
                        isChangeMade=0;

                        for(int index=0;index<recordsCount-1;index++)
                        {
                            if(CurrentRecords[index].price>CurrentRecords[index+1].price)
                            {
                                isChangeMade=1;

                                tempApartament=CurrentRecords[index];
                                CurrentRecords[index]=CurrentRecords[index+1];
                                CurrentRecords[index+1]=tempApartament;
                            }
                        }
                    }

                    for(index=0;index<recordsCount;index++)
                    {
                        ShowRecord(CurrentRecords[index]);
                    }
                }
            }
         }
    }

レコードを表示する関数:

    void ShowRecord(Appartament Record)
    {
        cout<<"Apartment Information"<<endl;
        cout<<"The address is - "<<Record.address<<" and it is only "<<Record.distanceFromCenter<<" miles away from the center."<<endl;
        cout<<"The price is "<<Record.price<<" $ for "<<Record.roomCount<<" rooms with "<<Record.view<<" view."<<endl;
    }

これは可能な出力です:

ここに画像の説明を入力

他のバージョンの Borland を使用して他のマシンでプログラムを実行しましたが、完全に動作しています。そのため、私のコンパイラの何が問題なのかという質問があります:?

4

0 に答える 0