1

私はc++を使用して256カウントを調べ、ASCII代表をファイルに書き込みます。

256文字の文字列を生成する方法を使用して、その文字列をファイルに書き込むと、ファイルの重量は258バイトになります。

string fileString = "";

//using the counter to attach the ASCII count to the string.
for(int i = 0; i <= 256; i++)
{
    fileString += i;
}

file << fileString;

ループを使用してファイルに書き込む方法を使用すると、ファイルは正確に256バイトになります。

//using the counter to attach the ASCII count to the string.
for(int i = 0; i <= 256; i++)
{
    file << (char)i;
}

文字列はどうなっているのでしょうか。文字列からの追加情報はファイルに書き込まれていますか?

4

2 に答える 2

6

これらは両方とも 256 バイトのファイルを作成します。

#include <fstream>
#include <string>

int main(void)
{
    std::ofstream file("output.txt", std::ios_base::binary);
    std::string fileString;

    for(int i = 0; i < 256; i++)
    {
        fileString += static_cast<char>(i);
    }

    file << fileString;
}

と:

#include <fstream>
#include <string>

int main(void)
{
    std::ofstream file("output.txt", std::ios_base::binary);
    std::string fileString;

    for (int i = 0; i < 256; ++i)
    {
        file << static_cast<char>(i);
    }

    file.close();
}

256 番目の ASCII 文字はなく、0 ~ 255 しかないため、off-by-one エラーが発生する前に注意してください。印刷時に文字に切り捨てられます。また、好むstatic_cast

それらをバイナリとして開かないと、最後に改行が追加されます。私の標準は出力の分野では弱いですが、テキストファイルは常に最後に改行があると想定されていることを知っており、これを挿入しています。私が標準で見つけることができるのは、「デストラクタが追加の実装定義の操作を実行できる」ということだけなので、これは実装定義だと思います。

もちろん、バイナリとして開くと、すべてのバーが削除され、ファイルのすべての詳細を制御できます。


Alterlife の懸念事項として、文字列に 0 を格納できますが、C スタイルの文字列は 0 で終了します。したがって、次のようになります。

#include <cstring>
#include <iostream>
#include <string>

int main(void)
{
    std::string result;

    result = "apple";
    result += static_cast<char>(0);
    result += "pear";

    std::cout << result.size() << " vs "
        << std::strlen(result.c_str()) << std::endl;
}

2 つの異なる長さを出力します: 1 つはカウントされ、もう 1 つは null で終了します。

于 2009-10-20T04:19:44.987 に答える
0

私はC ++にあまり慣れていませんが、ファイル文字列変数をnullまたは「/ 0」で初期化しようとしましたか?? 多分それは256バイトのファイルを与えるでしょう..

いいえ、ループは < 256 にする必要があります

PS: よくわかりませんが、試してみる価値はあると思います..

于 2009-10-20T04:20:48.917 に答える