在C中读写pdf或二进制数据

时间:2017-09-22 12:56:03

标签: c file-io

我正在实施ftp,我想上传和下载文件,当我下载或上传pdf文件时,它们已损坏。如何处理阅读任何文件,使用read()write()mmap?下面是我试过的简化代码。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int     is_regular_file(const char *path)
{
    struct stat path_stat;

    stat(path, &path_stat);
    return (S_ISREG(path_stat.st_mode));
}

int     ft_get_file_size(const char *filename)
{
    struct stat file;
    int         fd;

    if (!is_regular_file(filename))
        return (-1);
    fd = open(filename, O_RDONLY);
    memset(&file, 0, sizeof(struct stat));
    fstat(fd, &file);
    close(fd);
    return (file.st_size);
}

char    *read_file(const char *filename)
{
    char    *content;
    int     file_size;
    int     fd;
    ssize_t retval;

    if ((file_size = ft_get_file_size(filename)) <= 0)
        return (NULL);
    content = (char *)malloc(sizeof(char) * file_size + 1);
    fd = open(filename, O_RDONLY);
    retval = read(fd, content, file_size);
    content[retval + 1] = '\0';
    close(fd);
    return (content);
}

void    write_file(char *file, char *content)
{
    int fd;

    fd = open(file, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR);
    if (fd)
        write(fd, content, strlen(content));
    close(fd);
}

int main() {
    char *test = read_file("ftp.en.pdf");
    write_file("copy.pdf", test);
    return EXIT_SUCCESS;
}

下载和上传文件的过程是从文件中读取所有数据,然后将该数据发送到套接字。我尝试过使用mmap,但仍然会损坏文件。

  

文档已损坏错误消息

Corrupted file

1 个答案:

答案 0 :(得分:4)

由于二进制数据可以包含\0个字符,因此您无法将内容视为字符串,因此strlen(content)错误。您必须从read_file函数返回内容的大小。

例如,将您的函数定义为char *read_file(const char *filename, int *size)并返回*size中的大小。同样将您的写入函数定义为void write_file(char *file, char *content, int size)

(并忘记malloc中的+1)