3

第一次在这里发帖,谷歌搜索了几个小时,我找不到任何东西。

我正在尝试编写一个客户端程序来读取不同的文件并将它们通过网络发送到服务器程序。(用于备份目的。)

到目前为止,我已经使用 fread() 将文件放入缓冲区,其方式类似于: http ://www.cplusplus.com/reference/clibrary/cstdio/fread/

它适用于纯文本文件,但是当我尝试传输可执行文件时, fread() 似乎没有读取文件,只将“ELF”读取到缓冲区中。

我的问题是,将 ELF 文件的内容读入 C 中的缓冲区的正确方法是什么?

谢谢你。

4

2 回答 2

2

处理 ELF 文件的最佳方法是使用 ELF 库(libelf谷歌知道它),假设它对您可用。ELF 文件具有复杂的结构,并且该库通常会使处理文件变得更容易。

如果您必须使用fread(),那么只要您认识到数据充满了空字节或零字节,并且由于数据中的零,普通字符串函数将无法准确处理数据,它就可以正常工作。特别是,诸如printf()在第一个零字节处停止打印字符串之类的功能。

要通过网络备份任意文件,您只需打开文件(以二进制模式;它对 Unix 没有危害,对 Windows 至关重要),然后将大块读入内存并再次写出:

/* Copy the rest of f1 to f2 */
void fcopy(FILE *f1, FILE *f2)
{
    char            buffer[BUFSIZ];
    size_t          n;

    while ((n = fread(buffer, sizeof(char), sizeof(buffer), f1)) > 0)
    {
        if (fwrite(buffer, sizeof(char), n, f2) != n)
            err_syserr("write failed\n");
    }
}

err_syserr()函数是一个简单的错误报告函数,它报告其参数中给出的错误并添加系统错误消息 ( strerror(errno)) 并退出。

于 2011-07-02T06:22:32.377 回答
0

读取二进制文件的正确方法是简单地使用fread(). 但请记住,您不能将内容视为字符串,这意味着(除其他外)您不能strlen()用来确定它们的长度。

相反,您必须将长度保存在单独的变量中。的返回值fread()将告诉您它成功读取了多少条记录 - 如果您将记录大小设置为 1(第二个参数为fread()),那么它将返回读取的字节数。

于 2011-07-02T04:46:41.937 回答