【问题标题】:read() fill the buffer with extra charactersread() 用多余的字符填充缓冲区
【发布时间】:2017-05-30 16:13:34
【问题描述】:


我正在编写一个简单的程序,该程序读取一个 1024 字节 x 1024 字节的文件(填充一个随机字母,重复随机数次)并将其发送到 FIFO 管道中。
首先,如果我的文件大小为 2007B,则第一次读取(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

【问题讨论】:

    标签: c io system-calls


    【解决方案1】:

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

    【讨论】:

    • 完美,我明白了。只是别的,从 FIFO 读取的其他程序(服务器)将结果存储在 tmpfile 中以等待,以便在将整个文件写入标准输出之前获得整个文件。每次读取一个块(仍然是 1024B)时,它都会为总大小增加一个变量。当文件完全在 tmpfile 中时,服务器以一个 size_total 大小的块读取它,并在 stdout 上重写它。但是根据我得到的结果,似乎只有第一个块读取在 tmpfile 中,其余字符(size_total - 1024)再次是随机字符。
    • @RomainArtru:您可能在服务器端遇到同样的问题。假设空终止是客户端服务器通信中的一个经典错误。使用fwrite() 而不是printf()fputs() 来输出缓冲区内容。
    • 我实际使用过:write(STDOUT_FILENO, buffer_f, size_total)
    • @RomainArtru:你一口气写了size_total字节,但块只有1024字节?如果没有完整的源代码,很难说出确切的错误。
    • 好吧,我首先从我的 tmp 中读取 size_total,因此它们应该是 char no 的数量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2021-04-12
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多