0

バッファ内の新しい行とともに完全な行を提供するために fgets() で使用しているファイル ポインタがあります。1文字を置き換えて、改行の前に別の文字を追加したい。それは可能ですか?例えば:

buffer is "12345;\n"
output buffer is "12345xy\n"

これはコードです:

buff = fgets((char *)newbuff, IO_BufferSize , IO_handle[i_inx]->fp);
nptr = IO_handle[i_inx]->fp;
if(feof(nptr))
    {
            memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"E",1);
    }
    else
    {
            memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"R",1);
    }

ご覧のとおり、ここで新しい行を置き換えています (行の例は上に表示されています)。上記で行っていることの代わりに、テキストを挿入して新しい行を保持したい。

4

2 に答える 2

3

思い通りに 1 文字を挿入することはできません。o_rec_bufに十分なスペースがあり、行が常に で終わることが確実な場合は";\n"、次のようにすることができます。

size_t n = strlen(newbuff);
if (n >= 2)
    strcpy(o_rec_buf + n - 1, "E\n");
    /* memcpy(o_rec_buf+n-1, "E\n", 3); works too */

feof()あなたがするように 使用することは、ほとんどの場合エラーであることに注意してください。ファイルにヒットした後feof()、ファイルのエンドオブファイル条件にヒットしたかどうかを通知します。上記のコードをループで実行している場合、が 'true' を返すと、 によって読み取られる行はなく、 になりますが、変更されません。つまり、最後の呼び出しからのデータが含まれます。最後の行を 2 回処理します。詳細と解決策については、 CLC FAQ 12.2を参照してください。feof()fgetsbuffNULLnewbuffnewbufffgets

最後に、なぜすべてのキャスト? 型であり、型ではありませんo_rec_bufか?newbuffchar *

于 2009-12-27T14:34:09.613 に答える
1

バッファーに十分なスペースがある場合は、memmove を使用してトレーラーを 1 文字さらに移動し、必要な文字を更新する必要があります。末尾の '\0' を memmove することを忘れないでください。

于 2009-12-27T13:52:13.533 に答える