从二进制文件

时间:2018-03-06 06:51:17

标签: c file malloc

从二进制文件中读取。我被要求找出超过4个字符的序列,并且每行打印出一个序列。 check是一个检查字符是否可打印的功能。但是我的程序不断在序列之间打印出一条完整的新行,有时它会打印出只有3个字符长的序列。 size是文件大小,start和end表示序列的第一个字符的索引和最后一个字符的索引。以下是我的代码的一部分:

char* buffer = malloc(size);
fread(buffer, size, 1, file);   
while (end + 1 <= size){
    while(check(buffer[end]) == 1){
        end++;
    }
    if ((end - start + 1 ) >= 4){
        printf("%.*s\n", end - start + 1, &buffer[start]);
    }
    end++;
    start = end;
}
free(buffer);
fclose(file);

int check(char char){
if ((char >= 32)&&(char <= 126))
    return 1;
else
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您正在使用printf("%20s")之类的操作,它希望以0结尾的字符串作为输入。请注意,fread不会添加此类终止字符; 此外,20表示最小宽度和填充,但printf将永远不会截断值。因此,它将一直打印到输入字符串的(可能缺少的)结尾,可能超过缓冲区并产生未定义的行为。

我要做以下事情:

char* buffer = malloc(size+1);
fread(buffer, size, 1, file);
buffer[size]='\0';  // to be sure that you come to an end

while (end + 1 <= size){
    while(check(buffer[end]) == 1){
        end++;
    }
    if ((end - start + 1 ) >= 4){
        buffer[end] = '\0'; // terminate the sequence
        printf("%s\n", &buffer[start]);
    }
    end++;
    start = end;
}
free(buffer);
fclose(file);