从文件中读取C,它显示为“@”

时间:2012-05-24 17:23:33

标签: c file file-processing

我正在尝试用C语言读取文件。但是当我读到并将其写入stdout时,它也会打印@在我的文件中没有。是什么原因?

    #include <stdio.h>

int main() {

FILE *fp;
int br;
char buffer[10];
int i;
fp = fopen("a.txt","r");
while(1) {
        br = fread(buffer,1,10,fp);
        printf("%s",buffer);
        if (br==0)
                break;
        }
}

输出:

1234567891 @ 2345678912 @ 3456789 12 @ 3456789 12 @

文件: 123456789123456789123456789

2 个答案:

答案 0 :(得分:6)

您的fread调用最多可以读取10个字节,但printf %s要求字符串为空终止。您可以通过将缓冲区的大小增加到11个字节并在每次调用fread后在数据末尾写入零来修复它,即buffer[br] = 0;

另一种方法是通过调用printf告诉printf("%.*s", br, buffer);数据的大小。那么您不需要修改缓冲区数组。

答案 1 :(得分:2)

动态分配缓冲区并将其初始化为零,如下所示:

  char *buffer = calloc(1, 11);

   <do your read loop>

   free(buffer)

通过这种方式,您可以在结尾处获得零字节,这将在打印时终止字符串。当C打印一个字符串时,它期望它被一个NULL(或0)字节终止。