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

时间:2017-01-15 20:31:15

标签: c io system-calls


我正在编写一个简单的程序来读取一个文件(填充随机字母重复随机数字)1024字节×1024字节并将其发送到FIFO管道。
首先,如果我的文件大小为2007B,则第一次读取(fdFile,buffer_f,1024)正确读取,例如1020B,最后一次读取将是随机字符,如?qR?。
然后,在第二次读取时,返回的值应该是983,但缓冲区包含的绝对相同的字符串比之前大小为1024.
有人知道为什么PLZ?
当我从我的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

1 个答案:

答案 0 :(得分:2)

传递给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()将忽略第一个空字节后面的任何内容。