为什么输出程序有所不同?

时间:2012-05-22 13:08:27

标签: c file

#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。 但这就是为什么我要垃圾?

2 个答案:

答案 0 :(得分:4)

你告诉fwrite()从缓冲区写两次strlen(buffer)个字节(通过设置nmemb = 2你要写两个“对象”,每个对象都是{{} 1}}字节长),因此它读取实际存在的字节数的两倍。

“垃圾”就是字符串在strlen(buffer)结束后在内存中出现的任何内容。

这是破解的代码,buffer应为nmemb

答案 1 :(得分: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^@^@^@^@^@^@^@^@^@^@^@^@^@^@

但文字总是写一次。区别在于将写入多少字节