1

私がしたいこと:

レコードをファイルに保存します。これらのレコードには 2 つのことがあります。

time_t rt; //which stores the time the record was entered by the user

これに伴い、1 つの文字列を保存したいと考えています。でも紐の長さはわかりません。

実行時に決定され、ユーザーが入力する文字数によって異なります。

何をする必要がありますか(私によると):

私は見当もつかない。動的メモリ割り当てについては知っていますが、これをそのような問題に適用する方法がわかりませんでした。

私が試したこと:

ユーザーから一度に1文字ずつ取得して、テキストファイルに保存しようとしました(一時的に)。

ofstream fileObject;

fileObject.open("temp.txt");

for(int j=0;;j++)
{
  ch = _getche();

if( ch == 13)  break; //user has pressed the return key

  fileObject<<ch;
}

次に、次のコードを使用してファイルのサイズを確認しました。

fileObject.seekp(0,ios::end);

long pos = fileObject.tellg(); //this is the size of the file

次に、ファイルのサイズの動的配列を宣言しました。

char * entry;

entry = new char[pos]

ファイルを「out」モードで閉じ、「in」モードで再度開きました。

fileObject.close();

ifstream fout;

fout.open("temp.txt"); //this is the name of the text file that i had given

次に、文字ごとに、テキスト ファイルの内容を文字配列にコピーしました。

for(int i=0;i<pos;i++)

  fout>>info[i];

info[i] = '\0';

fout.close();

しかし、今、私はさらに何をすべきかわかりません。

手伝ってほしいこと:

このレコードをクラス オブジェクトとしてバイナリの「.dat」ファイルに書き込む方法を教えてください。

私の仕様:

Windows XP SP3

IDE: Visual C++ 2010 Express

4

4 に答える 4

1

文字列の制限は何ですか? また、ユーザーが必要なすべてのデータを文字列に入力したことをどのように認識しますか?

文字列を 1 行にする必要があり、「妥当な」長さ (つまり、メモリに簡単に収まる) を想定できる場合は、 を使用std::getlineして文字列を std::string(入力用に) に取得し、出力形式を定義できます。ファイルについて言います。ユーザー文字列が複数行になる可能性がある場合は、それらを入力するためのプロトコルを定義する必要があり (1 つのレコードがいつ終了したかを知ることができます)、ファイルのより複雑な形式を定義する必要があります: 1 つの提案は、レコードを空行 (つまり、入力に空行を含めることはできません)、または次の行に沿ってレコード ヘッダーを使用します。(Subversion はメッセージにこれのバリアントを使用します。ただし、もう少し情報がありますが、タイムスタンプと行数はそこにあります。)"%Y-%m-%d %H:%M:%S: user string\n""%Y-%m-%d %H:%M:%S line_count\n"commit

于 2013-02-25T09:42:12.537 に答える
1

std::stringとをヘッダーstd::getlineから使用します。<string>

于 2013-02-25T09:20:57.573 に答える
1

1つの文字列を保存したい。でも紐の長さはわかりません。

std::string次に、事前に割り当てられた s の配列ではなく、使用する必要がありますchar

struct user_record
{
    time_t rt; //which stores the time the record was entered by the user
    std::string one_string;
};

このレコードをクラス オブジェクトとしてバイナリの「.dat」ファイルに書き込む方法を教えてください。

利用可能なシリアル化オプションは多数あります。おそらく最も簡単な方法は、標準のストリーム操作を使用して、これをプレーン テキストとして記述することです。

std::ostream& operator <<(std::ostream& os, user_record const& ur)
{
    return os << ur.rt << ' ' << ur.one_string;
}

std::istream& operator >>(std::istream& is, user_record& ur)
{
    return is >> ur.rt >> ur.one_string;
}

単一行の文字列よりも複雑なものについては、おそらくBoostシリアル化ライブラリを調査する必要があります。

于 2013-02-25T09:21:13.867 に答える
1

C++ を使用している場合は、それstd::stringが最適です。

std::string abc="";
于 2013-02-25T09:21:43.160 に答える