需要将二进制文件转换为Txt文件

时间:2011-03-02 14:17:12

标签: c++

我有一个dat(二进制)文件,但我希望使用c ++将此文件转换为Ascii(txt)文件,但我是c ++编程中的新手。所以我要打开我的2个文件:myBinaryfile和myTxtFile但我不知道知道如何从该dat文件读取数据,然后知道如何将这些数据写入新的txt文件。所以我想编写一个c +代码,它接收包含二进制dat文件的输入,并将其转换为输出文件中的Ascii txt 。如果可能,请帮助编写此代码。感谢

很抱歉再次提出同样的问题,但我仍然没有解决我的问题,我会更清楚地解释如下:我有一个名为“A.txt”的txt文件,所以我想将其转换为二进制文件( B.dat)和反过程。两个问题: 1.如何在c ++中将“A.txt”转换为“B.dat” 2.如何在c ++中将“B.dat”转换为“C.txt”(需要将第一个输出的结果再次转换为新的ascii文件)

我的文本文件就像(没有标题):

第1行:1234.123 543.213 67543.210 1234.67 12.000 第2行:4234.423 843.200 60543.232 5634.60 72.012

它有超过1000行相似的样式(每行5列)。

由于我没有c ++的经验,我在这里很挣扎,所以需要你的帮助。非常感谢

3 个答案:

答案 0 :(得分:2)

所有文件只是一个字节流。您可以以二进制模式或文本模式打开文件。后者只是意味着它可能有额外的换行处理。

如果您希望文本文件仅包含安全的人类可读字符,则可以在将二进制数据保存到文本文件之前执行base64 encode之类的操作。

答案 1 :(得分:1)

非常简单:

  1. 创建目标或目标文件 (a.k.a. open)。
  2. binary模式下的开源文件, 这会阻止操作系统的翻译 内容。
  3. 从源读取八位字节(字节) 文件; unsigned char很好 变量类型。
  4. 将八位字节写入目的地 使用你喜欢的转换,十六进制, 小数等等。
  5. 在3处重复,直到读取失败。
  6. 关闭所有文件。
  7. 研究这些关键字:ifstream, ofstream, hex modifier, dec modifier, istream::read, ostream::write

    有些实用程序和应用程序已经执行此操作。在* nix和Cygwin端尝试od,* octal dump`并将内容传递给文件。

    MS-DOS系统上有debug实用程序。

    一种流行的格式是:

    AAAAAA    bb bb bb bb bb bb bb bb   bb bb bb bb bb bb bb bb   cccccccccccccccc  
    where:  
      AAAAAA -- Offset from beginning of file in hexadecimal or decimal.
      bb     -- Hex value of byte using ASCII text.
      c      -- Character representation of byte, '.' if the value is not printable.
    

    请编辑您的帖子以提供更多详细信息,包括目标文件的示例布局。

    编辑:

    一个复杂的例子(未经测试):

    #include <iostream>
    #include <fstream>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    
    const unsigned int READ_BUFFER_SIZE = 1024 * 1024;
    const unsigned int WRITE_BUFFER_SIZE = 2 * READ_BUFFER_SIZE;
    
    unsigned char read_buffer[READ_BUFFER_SIZE];
    unsigned char write_buffer[WRITE_BUFFER_SIZE];
    
    int main(void)
    {
        int program_status = EXIT_FAILURE;
        static const char hex_chars[] = "0123456789ABCDEF";
        do
        {
            ifstream srce_file("binary.dat", ios::binary);
            if (!srce_file)
            {
                cerr << "Error opening input file." << endl;
                break;
            }
            ofstream dest_file("binary.txt");
            if (!dest_file)
            {
                cerr << "Error creating output file." << endl;
            }
    
            // While no read errors from reading a block of source data:
            while (srce_file.read(&read_buffer[0], READ_BUFFER_SIZE))
            {
                // Get the number of bytes actually read.
                const unsigned int bytes_read = srce_file.gcount();
    
                // Define the index and byte variables outside
                //   of the loop to maybe save some execution time.
                unsigned int i = 0;
                unsigned char byte = 0;
    
                // For each byte that was read:
                for (i = 0; i < bytes_read; ++i)
                {
                    // Get source, binary value.
                    byte = read_buffer[i];
    
                    // Convert the Most Significant nibble to an
                    //   ASCII character using a lookup table.
                    // Write the character into the output buffer.
                    write_buffer[i * 2 + 0] = hex_chars[(byte >> 8)];
    
                    // Convert the Least Significant nibble to an
                    //   ASCII character and put into output buffer.  
                    write_buffer[i * 2 + 1] = hex_chars[byte & 0x0f];
                }
    
                // Write the output buffer to the output, text, file.
                dest_file.write(&write_buffer[0], 2 * bytes_read);
    
                // Flush the contents of the stream buffer as a precaution.
                dest_file.flush();
            }
            dest_file.flush();
            dest_file.close();
            srce_file.close();
            program_status = EXIT_SUCCESS;
        } while (false);
        return program_status;
    }
    

    上述程序从二进制文件中读取1MB块,将ASCII十六进制转换为输出缓冲区,然后将块写入文本文件。

答案 2 :(得分:0)

我认为你误解了二进制文件和测试文件之间的区别在于对内容的解释。