在C中将二进制文件转换为文本文件

时间:2016-02-28 02:11:48

标签: c text binary

我在尝试将二进制文件转换为文本文件时遇到问题。现在,我得到的输出是“你好16”。我应该得到5行输出,其中第一行应该是“你好32”。我不确定自己哪里出错了,但我现在一直想弄清楚几个小时。 Link to Binary File

void BinaryToText(char *inputFile, char *outputFile) {
    unsigned char str[256];
    unsigned int num;
    int fileLen;

    FILE *finp;
    FILE *fout;

    finp = fopen(inputFile, "r");
    fout = fopen(outputFile, "w");

    fseek(finp, 0, SEEK_END);
    fileLen = ftell(finp);
    fseek(finp, 0, SEEK_SET);

    while (fread(&fileLen, sizeof(char), 1, finp) == 1) {
        fread(&str, sizeof(str), 1, finp);
        fread(&num, sizeof(int), 1, finp); 
        fprintf(fout, "%s %d\n", str, num);
    }
    fclose(finp);
    fclose(fout);
}

1 个答案:

答案 0 :(得分:1)

你的二进制文件格式似乎很尴尬:

  • 使用"r"打开输入文件:应使用"rb"以二进制模式打开。
  • 您首先尝试使用ftell()确定文件大小。请注意,这不适用于管道和设备。在你的情况下,无论如何你都不使用fileLen也没关系。
  • 在循环中:
    • 您读取了存储在fileLen
    • 部分中的单个字节
    • 然后读取一个256字节的字符串。
    • 您直接读取了一个数字,假设int的字节顺序和大小符合您的预期。
    • 然后打印字符串,假设文件中有'\0',否则您将调用未定义的行为。

如果没有看到编写代码,很难说出错了什么。

请注意,二进制文件应该以{{1​​}}打开,以防止在某些平台(尤其是Windows)上对换行序列进行虚假转换。

修改

形成评论中提供的额外信息,这是一个修改后的版本,应该更适当地解析二进制文件:

"rb"