1

Cでファイルを読み取ろうとしていますが、読み取り、stdoutに書き込むと、ファイルにない@も出力されます。理由は何ですか?

    #include <stdio.h>

int main() {

FILE *fp;
int br;
char buffer[10];
int i;
fp = fopen("a.txt","r");
while(1) {
        br = fread(buffer,1,10,fp);
        printf("%s",buffer);
        if (br==0)
                break;
        }
}

出力:

1234567891 @ 2345678912 @ 3456789 12 @ 3456789 12 @

ファイル:123456789123456789123456789

4

2 に答える 2

6

呼び出しfreadは最大10バイトを正しく読み取りますが、文字列をnullで終了する必要がありますprintf%sバッファのサイズを11バイトに増やし、すべての呼び出しの後freadにデータの最後にゼロを書き込むことで、これを修正できますbuffer[br] = 0;

もう1つの方法printfは、を呼び出してデータのサイズを確認することprintf("%.*s", br, buffer);です。その場合、バッファ配列を変更する必要はありません。

于 2012-05-24T17:34:50.557 に答える
2

バッファを動的に割り当て、次のようにゼロに初期化します。

  char *buffer = calloc(1, 11);

   <do your read loop>

   free(buffer)

このようにして、最後にゼロバイトを取得し、印刷時に文字列を終了します。Cが文字列を出力するとき、それはNULL(または0)バイトで終了することを期待します。

于 2012-05-24T17:29:32.963 に答える