【问题标题】:C Fread Split Textfile into ChunksC Fread 将文本文件拆分成块
【发布时间】:2018-03-22 00:31:35
【问题描述】:

我有一个未知大小的文本文件,必须通过套接字从我的服务器以特定(可变大小)的块将其发送到客户端。

我如何将 Fread 用于该任务?我读了很多关于 Fread 的文章,但我正在努力使用那种指针,我应该在我的案例中传递那个函数?

size_t fread(void * ptr, size_t size, size_t count, FILE * stream);

【问题讨论】:

  • 编写一些代码,调试它,然后展示给我们。试试看。
  • 函数原型告诉你可以使用什么样的指针;任何事物。这是void *
  • 继续分块阅读,直到读完为止。选择一些要使用的块大小。
  • edit您的问题显示the code you have so far。您应该至少包含您遇到问题的代码的大纲(但最好是minimal reproducible example),然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask

标签: c string pointers void fread


【解决方案1】:

我如何使用 fread 来完成这项任务?

只需继续从服务器向客户端发送(固定大小的)块,直到服务器不再发送任何其他内容。

在我的情况下我应该传递什么样的指针?

任何东西。

检查fread() 的示例,其中fread() 中传递的bufferchar 类型,而fread() 只是允许它,因为该函数的第一个参数是:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

所以只需将用于存储数据(块)的数组传递给函数。

【讨论】:

    【解决方案2】:

    要将文件作为块读取并将它们发送到套接字,您必须确定块的大小。
    例如:4096 是不会太大或太小的完美尺寸!

    示例

    我们选择4096 bytes 作为块大小。顺便说一句,它是可定制的。
    从文件中接收到块数据时,将块数据发送给客户端。

    #include <stdio.h>
    
    int main(ssize_t argc, char** argv)
    {
        // We're going to use "rb" because in (WINDOWS) you need it!
        FILE*   fp = fopen(argv[1], "rb");
        char    byte_buffer[4096];
        size_t  bytes_read = 0;
    
        while(( bytes_read = fread(&byte_buffer, 4096, 1, fp) )> 0)
            send_data_chunk_to_client_somehow(/* your parameters here */);
    }
    

    文本文件应该被分块读取并发送给客户端。

    fread(3) ― 二进制流 I/O

    fread(3) 兼容文本流和二进制流,它是 ANSI C 的一部分。 POSIX read(3) 等效于该函数并且比它更快。

    size_t fread(void* ptr, size_t size, size_t nmemb, FILE* fp);
    

    【讨论】:

    • 从技术上讲,您的 while 循环存在缺陷:每次迭代读取 1 个 4096 字节的元素。 fread 返回元素数,而不是字节数。所以bytes_read 总是 1 或 0 而不是 0...4096。如果您交换参数 4096 和 1,那么您的变量命名正确。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多