0

解決策は些細なことかもしれませんが、私はcppで鮮やかではありません。

コードを実行した後、の値はfunction strlen((char*)buffer)私が思っているよりも高くなっています。何故ですか?どうすれば修正できますか?(if filesize=48, than strlen((char*)buffer)=64そしてそれも48でなければなりません!)

    ifstream iffile;
    iffile.open(argv[1], ios::in | ios::binary | ios::ate);
    if (iffile.is_open())
    {
       long filesize = iffile.tellg();
       if (filesize > 0)
       {
           iffile.seekg(0, ios::beg);
           {
                 long pos = iffile.tellg();
                 if (pos != filesize)
                 {
                       char *buffer;
                       buffer = (char *)malloc(filesize * sizeof * buffer);
                       if (buffer != NULL)
                       {
                             memset(buffer, 0, filesize - pos);
                             iffile.read((char *)buffer, filesize);

さらに、私のファイルには印刷できない値がたくさんあることに言及する必要があります。

4

2 に答える 2

2

コードは、'\0'文字の配列を文字列にするために、ファイルに終了文字が含まれていることを前提としています。このターミネータはstrlen()検索対象であるため、存在しない場合は追加する必要があります。

確実にする方法の1つは、malloc()(ちなみに、C ++ではもっと凝ったものになるはずですnew[])1文字以上、ロード後にfile_size設定することです。'\0'

また、割り当てとI/Oが成功することを確認する必要があります。

于 2013-03-13T16:00:17.680 に答える
1

mallocC++では使用しないでください。それはC-ismです。

オプション1

new代わりに使用してください。

buffer = new char[filesize]

delete[]使い終わったら、を使用してメモリの割り当てを解除する必要があります。

オプション2

C ++でも生のポインターを使用しないでください(自分が何をしているかを知っていて、100%感じていて、おいしいコーヒーを飲んでいて、一般的に勇敢であれば、使用できます)。

この場合、私はを使用すると思いますstd::vector<char>

std::vector<char> buffer(filesize);
iffile.read(&buffer.front(), filesize);

このようにして、stdライブラリがメモリを管理します。

于 2013-03-13T16:01:48.150 に答える