0

文字列のベクトルをディスクに保存すると、期待どおりに機能しません。そのファイルは作成されていますが、0バイトでエントリがありません。注:Xcode(v4.3.3)のMACOSでC++コードをコンパイルします。

ベクトルと文字列の宣言:

vector<string>taskVector;
string newTaskEntry;

これは、プログラムの実行中に配列に新しい文字列を追加する方法です。

taskVector.push_back(newTaskEntry);

ユーザーがプログラムを終了するとき、私はこれを行います:

        fstream file;
        file.open("data.txt", ios::out | ios::trunc);

        for (int i = 0; i > taskVector.size(); i++) {
            file.write(taskVector[i].c_str(), taskVector[i].length());
            file.close();

エントリが表示されない理由はありますか?次に、コンテンツをディスクに保存できるときにデータを読み戻す方法のヒントを教えてください。

4

2 に答える 2

5

ここにあなたの問題があります:

for (int i = 0; i > taskVector.size(); i++)

その行を注意深く見てください。

編集:あなたのアップデートに関しては、ここにいくつかのヒントがあります:

  1. std::getline()行ごとに読み取るために使用
  2. ベクトルに使用push_back()して、ベクトルに挿入します。
于 2012-07-03T07:41:40.917 に答える
3

最初に(@Nimが述べたように)あなたはあなたのチェックを間違ってしました:

for (int i = 0; i > taskVector.size(); i++) {

する必要があります

for (int i = 0; i < taskVector.size(); i++) {

2番目:ループから抜け出します:

for (int i = 0; i > taskVector.size(); i++) {
    file.write(taskVector[i].c_str(), taskVector[i].length());
}
file.close();

そして、それらを読み返すことについて:今のところ、情報、文字列の終わり、または文字列の長さは保存されません。それがなければ、文字列と(そしてそれらがいくつあるか)を推測する必要があります。次のいずれかをお勧めします。

文字列がファイルで終了することを示す終了バイトを取得します。'\0'アイデアになります。ただし、文字列に含まれていないことを確認する必要があります。そうしないと、文字列を正しく再作成できません。読み返すときは、その文字で分割します。

もう1つの方法は、文字列の長さ情報を文字列の前に格納することです。文字列を格納する前に、4バイトのunsignedintを前に格納できます。次に、読み戻すときは、最初に4バイトの文字列を読み戻し、次にその数値が示すバイト数を読み戻します。問題:文字列の最大長を決定する必要があります(4バイトの長さ情報を使用すると、約4.8 * 10 ^ 9バイトになります)。また、別のコンピューターで使用する場合は、システムのバイト順序(ビッグエンディアンとリトルエンディアン)を確認できます。

于 2012-07-03T07:52:38.200 に答える