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()
忽略。
我正在编写一个简单的程序,它读取一个 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()
忽略。