#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
。
但这就是为什么我要垃圾?
答案 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^@^@^@^@^@^@^@^@^@^@^@^@^@^@
但文字总是写一次。区别在于将写入多少字节