0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE *fp;
    char ch;
    char buffer[80] ;
    fp = fopen("c:\\Rasmi Personal\\hello.txt", "w");

    if(fp == NULL)
    {
        printf("File not found");
        exit(1);
    }
    else
    {
        while(1)
        {
            gets(buffer);
            fwrite(buffer, strlen(buffer), 2, fp); /* I made, size_t nitems = 2 (third element/argument)*/
            fwrite("\n", 1, 1, fp);
        }

    }

    fclose(fp);

    return 0;
}

入力:

Rasmi Ranjan Nayak

出力:

Rasmi Ranjan Nayak      0@ ÿ" 8ÿ" 

なぜこのゴミが来るのか。

fwrite()関数によると。その場合、入力されたsize_t nitems is more than 1テキストが書き込まれmore than onceます。しかし、なぜ私はゴミを出しているのですか?

4

2 に答える 2

4

バッファからfwrite()2倍のバイトを書き込むように指示しているので(それぞれがバイト長の2つの「オブジェクト」を書き込むように設定することにより)、実際に存在するバイト数の2倍を読み取ります。strlen(buffer)nmemb = 2strlen(buffer)

「ガベージ」とは、文字列が。で終わった後にメモリに表示されるもののことbufferです。

これは壊れたコードnmembです1

于 2012-05-22T13:12:36.270 に答える
1

fwrite関数のシグネチャは

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

ptr
  Pointer to the array of elements to be written.
size
  Size in bytes of each element to be written.
count
  Number of elements, each one with a size of size bytes.
stream
  Pointer to a FILE object that specifies an output stream.

この場合、元の文字列よりも大きい(バイト単位の)count * sizeを書き込もうとすると、このガベージが発生します。バッファを掃除する場合

memset(buffer,0,80*sizeof(char));
gets(buffer);

おそらく別の結果が表示されます

$ ./a.out
asdadsadasdsad

$ cat -v hello.txt 
asdadsadasdsad^@^@^@^@^@^@^@^@^@^@^@^@^@^@

しかし、テキストは常に一度だけ書かれます。違いは、書き込まれるバイト数です。

于 2012-05-22T13:21:56.830 に答える