read() 用额外的字符填充缓冲区

read() fill the buffer with extra characters


我正在编写一个简单的程序,它读取一个 1024 字节 x 1024 字节的文件(填充随机字母,重复随机次数),并将其发送到 FIFO 管道中。
首先,如果我的文件大小为 2007B,则第一个 read(fdFile, buffer_f, 1024) 正确读取例如 1020B,最后 4 个将是随机字符,如 ?qR?。
然后,在第二次读取时,返回值应该是 983,但缓冲区包含的字符串与之前的大小 1024 完全相同。
有人知道为什么吗?
当我从我的 FIFO 中读取时,同样的事情发生了,但最后有一个不同的随机子字符串。

while((buffer_f_size = read(fdFile, buffer_f, 1024)) > 0){
    printf("Partida leida en el archivo arg : \n%s\nTamano de la partida : %d\n", buffer_f, buffer_f_size);
    fflush(stdout);


    if(write(fdprox, buffer_f, buffer_f_size) != buffer_f_size){
        perror("Error en la lectura/escritura del archivo en el FIFO_proxy");
        exit(-1);
    }
}

Part of the execution concerned

传递给 printf 的缓冲区不一定有空终止符。

您应该传递要从缓冲区打印的最大字节数:

while ((buffer_f_size = read(fdFile, buffer_f, 1024)) > 0) {
    printf("Partida leida en el archivo arg :\n"
           "%.*s\n"
           "Tamano de la partida : %d\n",
           (int)buffer_f_size, buffer_f, (int)buffer_f_size);
    fflush(stdout);

    if (write(fdprox, buffer_f, buffer_f_size) != buffer_f_size) {
        perror("Error en la lectura/escritura del archivo en el FIFO_proxy");
        exit(-1);
    }
}

请注意,如果接收到的缓冲区包含空字节,则第一个空字节之后的任何内容都将被printf()忽略。