合并 2 个二进制文件。文件之间的剩余数据

Posted

技术标签:

【中文标题】合并 2 个二进制文件。文件之间的剩余数据【英文标题】:Merging 2 binary files. Residual data between files 【发布时间】:2016-07-31 18:37:15 【问题描述】:

我的任务是合并多个二进制文件,然后把它们全部放在一个txt文件中,我已经有了文件的格式,我已经写好了,但是我合并失败了。这是功能: Output from the binary file into the txt file.

int merge_files()

    FILE *f1, *ft;
    char ch, name1[20];
    int  error, n;
    char buffer[10000];
    printf("\n Give name of file: "); gets_s(name1, 19);
    while (strlen(name1) != NULL)
    
        fopen_s(&f1, name1, "rb");
        fopen_s(&ft, "finaldata.dat", "a");
        if (!f1)
        
            error = 1;
            break;
        
        else
        
            error = 0;

            rewind(f1);

            while (n = fread(buffer, sizeof(char), 10000, f1))
            
                fwrite(buffer, sizeof(char), n, ft);
                fflush(ft);
            
        

        fclose(f1);
        fclose(ft);
        printf("Files had been merged");
        printf("\n Give name of file: "); gets_s(name1, 19);
    

    return error;

【问题讨论】:

那是我的错,它看起来完全错误......我必须更仔细地检查 MS 版本。 @DavidC.Rankin 不行,我用的是 Visual Studio 2013,FILE* 与 FILE** 类型的参数不兼容 我告诉你错了——我很抱歉。我假设fopenfopen_s 采用相同的参数。我不使用 MS,所以当 whozcraig 指出 fopen_s 实际上想要一个 pointer-to-pointer-to-FILE 时,我感到很惊讶。恢复到原来的... @DavidC.Rankin 'fread(buffer, sizeof(char), 10000, f1)' 我从我在这里发布的内容中复制了它,我不太明白'..sizeof(char), 10000 ..' ,它没有出现在我的代码中。 【参考方案1】:

这不连贯:

fopen_s(&f1, name1, "rb");
fopen_s(&ft, "finaldata.dat", "a");

根据您的操作系统,它无法运行。默认模式是文本模式,因此您以二进制模式打开源文件,以文本模式打开目标文件。如果您的操作系统是 windows,您将获得补充字符。这样做:

fopen_s(&f1, name1, "rb");
fopen_s(&ft, "finaldata.dat", "ab"); // both files in binary mode

编辑:用下面的程序检查你的入口文件中没有utf-8 BOM

#include <stdio.h>

#define BOM_SIZE 3

int main(int argc, char *argv[])

    int err = 0;

    for (int i = 1; i < argc; i++) 
        FILE *f = fopen (argv[i], "r");
        if (f != NULL) 
            unsigned char buf[BOM_SIZE];
            if (fread(buf, sizeof(char), BOM_SIZE, f) == BOM_SIZE)
            
                printf("File %s starts with:\n", argv[1]);

                for (int j = 0; j < BOM_SIZE; j++)
                
                    printf("0x%02x%s", (unsigned int) buf[j], (j < BOM_SIZE - 1) ? ", " : "\n");
                
            
            else if (ferror(f))
            
                perror("fread");
                fprintf(stderr, "Error reading file %s\n.", argv[1]);
                err = 1;
            
            else
            
                printf("File %s is too short to have a UTF-8 BOM.\n", argv[1]);
            
            fclose(f);
        
        else
        
            perror("fopen");
            fprintf(stderr, "Could not open %s.\n", argv[i]);
            err = 1;
        
    

    return err;

如果任何文件以序列“0xef, 0xbb, 0xbf”开头,那么你就有一个 utf-8 bom!

【讨论】:

还是不行,还是加了补字符。 @sNow11 你能提供一些简单的文件来解决你的错误吗?我无法复制它。 这似乎是一个非常微妙的问题,我会做的任何事情,任何功能,它都会在每个合并文件后添加字符。我知道为什么。顺便说一句,我完全更改了功能,但仍然无法正常工作。如果我设法找到答案,我会在这里发布答案。感谢您的回答! @sNow11 你为什么拒绝传输这些文件?你知道什么是 UTF-8 BOM 吗?我在答案中添加代码来检查文件中的前三个字符。

以上是关于合并 2 个二进制文件。文件之间的剩余数据的主要内容,如果未能解决你的问题,请参考以下文章

2.4文件类型

协议缓冲区 - 将具有相同 .proto 文件的二进制数据文件合并到一个文件中

请问啥是二进制文件 啥是ASCII 啥是文本文件 它们之间有啥区别

如何将多个TXT合并成一个TXT

如何将几个二进制文件合成一个?

利用 Blob 处理 node 层返回的二进制文件流字符串并下载文件