1

相対ファイル1に書き込むことができます。その後、コンテンツを読み取って画面に表示しようとすると(データが実際にファイルにあるかどうかを確認するため)、ファイルにすでに存在していると思われるレコードがありません。 。Dev-C++を使用しています。どんな助けでもありがたいです。コードは以下のとおりです。

#include <iostream>   //   cin, cout
#include <iomanip>
#include <fstream>
#include <conio.h>
using namespace std;


#define SIZE 10

struct     client        // Client record
{   
    int    account;      // from 1 to SIZE
    char   name[20];
    double balance;
};


void make_file(char filename[], int number_of_records)
{
  cout << "\nMAKE_FILE: Creating a blank relative file " << filename
     << " containing " << number_of_records << " records.";
  ofstream OS(filename, ios::out);
  if(!OS) {cerr << "File open error." << endl; exit(1);}

  client blank={0, "", 0.0}; // Create an empty client record
  while(number_of_records--)
  OS.write((char *)&blank, sizeof(blank));
  cout << "\nFile created.";
  OS.close();
}
int main(void)
{  
   client c;
   void *ptr; 
   int n=0;  
   char *fname = "credit.txt";
   make_file(fname, SIZE);

   fstream iof("credit.txt",ios::in | ios::out);
   if(!iof)
   {
       cerr<<"File open error! "<<endl;
       exit(1);
   }
   cout<<"\n\nenter the 10 customers into the file: "<< fname<<endl<<endl;

   while(0 < c.account) // && c.account <= maxrec)
   {
      iof.seekp((c.account-1) * sizeof(client));  // position the pointer
      iof.write((char *)&c, sizeof(c));
      cout << "Account[1.."<< SIZE
       << "], Name, Balance  (0 0 0 to exit)= ";
      cin >> c.account >> c.name >> c.balance;
   }

    cout << "\n\nSHOW_FILE: The contents of file " << fname;
    iof.seekg (0, ios::beg);  
    while(iof.read((char *)&c, sizeof(c)))  //where I think the problem is
    {
        cout <<'\n'<< setw(3)<< ++n << setw(6) << c.account <<setw(20)
       << c.name << setw(10) << c.balance ;
       // << "     |  " << IS.eof() << "  " << ptr;

    }
    iof.close();

    cout << "\n\n"; 
    system("pause");
    return 0;

}

  1. 相対ファイルは、各レコードがファイル内の順序位置によって識別されるファイルであり、ランダムアクセスとシーケンシャルアクセスが可能です。

    相対ファイル

    相対的なファイル編成

    http://cayfer.bilkent.edu.tr/~cayfer/ctp108/relative.htm

4

3 に答える 3

1

バイナリの読み取り/書き込みを使用する必要があります。

fstream iof("credit.txt",ios::in | ios::out | ios::binary);
于 2012-05-11T07:17:01.887 に答える
1

あなたのコードでは、最初のループでc.accountは、初期化されていません。おそらく、初期化されていない値でファイルを上書きしています。

   while(0 < c.account) //  <--- c.account is not initialized!!
   {
      iof.seekp((c.account-1) * sizeof(client));  // position the pointer
      iof.write((char *)&c, sizeof(c));    // <-- overwriting data??
于 2012-05-11T07:17:19.123 に答える
0

私はiostreamであまり多くの作業を行っていないので、あなたは私に興味をそそられたプログラムです。レコードごとに編集する必要のあるデータを操作している場合は、xmlライブラリなど、これらすべてのものからカプセル化するある種のデータベースまたは特殊なライブラリを使用します。データは非常に小さいため、データ構造体の配列を使用してすべてのデータをアプリケーションにロードする方が簡単です。その後、新しいユーザー入力を取得したら、ファイルをクリアして、データを新しく書き込むのが最も簡単です。これが私がしたことです。

#include <stdio.h>
#include <tchar.h>
#include <iostream>   //   cin, cout
#include <iomanip>
#include <fstream>
#include <conio.h>

using namespace std;

#define SIZE 10
#define BUFFER_SIZE 100
#define NAME_SIZE 20

struct     client        // Client record
{   
    int    account;      // from 1 to SIZE
    char   name[NAME_SIZE];
    double balance;
};


/* Makes file if files does not exist.
 * Returns true if file already exists
 */
bool make_file(char filename[], int number_of_records)
{
    // Check if file exists
    fstream file;
    file.open(filename, ios_base::out | ios_base::in);  // will not create file
    if (file.is_open())
    {
        file.close();
        return true;
    }
    else
    {
        file.clear();
        file.open(filename, ios_base::out);
        if(!file) {cerr << "File open error." << endl; exit(1);}
        cout << "File created. \n";
        file.close();
        return false;
    }
}


/* Create an application that reads x number of accounts from a text file
 * into an array of client data structures.
 */
int _tmain(int argc, _TCHAR* argv[])
{  
        client clientArray[SIZE];
        char cleanName[NAME_SIZE];
        for(int i = 0; i < NAME_SIZE; i++)
            cleanName[i] = NULL;

        // Make file if doesn't not exist.
        char *fname = "credit.txt";
        bool fileExisted = false;
        fileExisted = make_file(fname, SIZE);

        // initialize client array
        for(int j = 0; j < SIZE; j++)
        {
            clientArray[j].account = -1;
            strcpy_s(clientArray[j].name, cleanName);
            clientArray[j].balance = 0.0;
        }

        // Open file and populate the client array
        fstream readFile("credit.txt", ios::in | ios::binary);
        if(fileExisted)
        {
            if(!readFile)
            {
               cerr<<"File open error! "<<endl;
               exit(1);
            }

            int index = 0;
            bool firstRun = true;
            client temp;

            while(index < SIZE)
            {
                readFile >> temp.account;
                readFile >> temp.name;
                readFile >> temp.balance;

                if(readFile.eof())
                    break;

                if(firstRun)
                {
                    cout << "Data read \n";
                    cout << "----------\n";
                    firstRun = false;
                }

                clientArray[index].account = temp.account;
                strcpy_s(clientArray[index].name, temp.name);
                clientArray[index].balance = temp.balance;

                cout << setw(3)  << index+1;
                cout << setw(6)  << clientArray[index].account;
                cout << setw(20) << clientArray[index].name;
                cout << setw(10) << clientArray[index].balance << "\n";
                index++;
            }
            readFile.close();
            readFile.clear();
        }

        // Get user input
        {
            client temp;        // Create and initialize temp client
            temp.account = 0;
            temp.balance = 0;
            strcpy_s(temp.name, cleanName);
            int index = 0;

            bool keepLooping = true;
            while(keepLooping)
            {
                cout << "Account[1.."<< SIZE << "], Name, Balance  (-1 to exit)= ";
                cin >> temp.account;

                // If user exited
                if(temp.account == -1)
                    keepLooping = false;
                else
                {
                    cin >> temp.name; // If not keep reading data
                    cin >> temp.balance;

                    // Find either unused account or same account
                    bool found = false;
                    int firstEmpty = -1;
                    for(int i = 0; i<SIZE; i++)
                    {
                        if(temp.account == clientArray[i].account) // Same account found
                        {
                            strcpy_s(clientArray[i].name, temp.name);
                            clientArray[i].balance = temp.balance;
                            found = true;
                            break;
                        }
                        else if((clientArray[i].account == -1)&&(firstEmpty == -1)) // Empty account found
                        {
                            firstEmpty = i;
                        }
                    }
                    if((firstEmpty != -1)&&(!found)) // Copy input to empty account
                    {
                        clientArray[firstEmpty].account = temp.account;
                        strcpy_s(clientArray[firstEmpty].name, temp.name);
                        clientArray[firstEmpty].balance = temp.balance;
                    }
                    else if(found) // 
                    {
                        cout << "Updating Client Data. \n";
                    }
                    else // No empty accounts break loop
                    {
                        cout << "Client array is full!\n";
                        keepLooping = false;
                    }
                }
            }
        } // end of user input scope


        // Clear file and write only valid data to new file
        {
            ofstream out;
            out.open("credit.txt");
            for(int i=0 ; i<SIZE ; i++)
            {
                if(clientArray[i].account != -1)
                {
                    out << clientArray[i].account << "\t";
                    out << clientArray[i].name << "\t";
                    out << clientArray[i].balance << "\n";
                }
            }
            out.close();
            out.clear();
        }

        // Open file and read the data
        {
            ifstream readFile("credit.txt", ios::in | ios::binary);
            // readFile("credit.txt", ios::in | ios::binary);
            if(!readFile)
            {
               cerr<<"File open error! "<<endl;
               exit(1);
            }
            if(!readFile.good())
            {
                cerr<<"File open error!2"<<endl;
                exit(1);
            }

            int index = 0; // scope variables
            client temp;
            temp.account = 0;
            temp.balance = 0;
            strcpy_s(temp.name, cleanName);

            cout << "\nAccounts" << "\n";
            cout << "----------" << "\n";
            bool readFileb = readFile.good();
            while(index < SIZE)
            {
                readFile >> temp.account;
                readFile >> temp.name;
                readFile >> temp.balance;
                if(readFile.eof())
                    break;
                cout << setw(3)  << index+1;
                cout << setw(6)  << temp.account;
                cout << setw(20) << temp.name;
                cout << setw(10) << temp.balance << "\n";
                index++;
            }
            readFile.close();
            readFile.clear();
        }

        system("pause");
}
于 2012-05-11T23:28:45.087 に答える