原因是:fp_len = 400,size_t len = 1

时间:2017-07-10 16:58:34

标签: c

确定内容长度并附加'\ 0'

printf("%d", fp_len);
printf("%d", len);

fp_len打印:400,而len打印:1

text[fp_len] = '\0';

我的理解是错的:

text[len] = '\0';

这是正确的:

$('#fileToUpload').change(function(){
    var file = this.files;
    filepreview(file);
});



function filepreview(files)
{
    var length = files.length;

    for(var i=0 ; i<length ; i++)
    {
            var file = files[i];

            var reader = new FileReader();
            reader.addEventListener("load",function(e){
                $('#pic'+i+'').attr('src' , ''+e.target.result+'');
            });
            reader.readAsDataURL(file);
    }
}

但如果“len”正在打印1 ..

不会'\ 0'被添加到数组的第二个位置?

3 个答案:

答案 0 :(得分:2)

调用fread(text, fp_len, 1, fp)要求读取一个大小为fp_len的元素,因此在成功执行结果后1(读取的元素数)或者如果读取失败则可以是0

如果要计算从文件中读取的字节数(字符数),可以更改参数的位置,例如

 fread(text, 1, fp_len, fp)

有关更多信息,请参阅references

答案 1 :(得分:1)

  

size_t fread(void * restrict ptr,size_t size,size_t nmemb,FILE * restrict stream);

正如其他人所说,fread返回1 - 读取的元素数量,每个元素的大小为size或400.

以正确的顺序放置增补。

// size_t len = fread(text, fp_len, 1, fp);
size_t len = fread(text, 1, fp_len, fp);

最好在这里避免像1这样的幻数。相反,请使用text[]元素的大小。

size_t len = fread(text, sizeof *text, fp_len, fp);

此外,代码缺少错误检查和printf()说明符的正确性。

if (fp == NULL) Handle_Error("fopen");
if (fseek(fp, 0, SEEK_END)) Handle_Error("fseek");
long fp_len = ftell(fp); 
if (fp_len == -1) Handle_Error("ftell");
if (fp_len < 0 || fp_len >= SIZE_MAX) Handle_Error("long to size_t");

char *text = malloc(sizeof *text * (fp_len + 1));
if (text == NULL)  Handle_Error("malloc");
size_t len = fread(text, 1, fp_len, fp);
if (len == 0 && fp_len > 0) Handle_Error("fread");
text[len] = '\0';

printf("%ld", fp_len); // note specifiers
printf("%zu", len);

答案 2 :(得分:0)

根据你需要写的manual page

fread(text, 1, fp_len, fp);