2012-05-22 99 views
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  [email protected] ÿ" 8ÿ" 

为什么这个垃圾来了。

根据fwrite()函数。如果size_t nitems is more than 1那么输入的文字将被写入more than once。 但这里为什么我得到垃圾?

+0

''buffer'中是否缺少终止NULL? – psur

+2

从http://linux.die.net/man/3/gets:永远不要使用gets()。因为事先不知道数据是不可能知道get()将读取多少个字符的,并且因为gets()会继续存储超过缓冲区末尾的字符,所以使用它非常危险。它已被用来破坏计算机安全。使用fgets()代替。 –

回答

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. 

在这种情况下,如果你尝试写数*尺寸是谁比你这个垃圾原始字符串更大的(以字节为单位)。如果您清洗缓冲

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

可能会看到不同的结果

$ ./a.out 
asdadsadasdsad 

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

但文本始终writen一次。不同之处在于将写入多少字节

4

你告诉fwrite()从缓存写入两次strlen(buffer)字节(通过设置nmemb = 2你让写两个“对象”,每一个都是strlen(buffer)字节长),所以它读取的字节数的两倍那实际上是存在的。

“垃圾”只是在字符串在buffer结束后出现在内存中的任何情况。

这是破码,nmemb应该是1

相关问题