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()写入两倍字节(通过设置您使其写入两个“对象”,每个对象都是字节长),因此它读取的字节数是实际存在的字节数的两倍。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 回答