需要在C ++中将txt文件转换为二进制文件

时间:2011-02-16 12:12:33

标签: c++

我有一个txt文件,数字如541399.531 261032.266 16.660(第一行) 541400.288 261032.284 16.642(第2行)........数百点。我想将此文件转换为二进制格式。任何人都可以帮助我吗?

8 个答案:

答案 0 :(得分:7)

我建议避免将二进制表示写入文件几百或几千点。这称为微优化,开发时间超过了可执行文件性能的任何增益。

大小不值得

在当前的计算中,大多数平台支持巨大的(千兆字节)文件大小,并且计算机具有兆字节或千兆字节的内存供程序使用。因此,与开发周期中的其他瓶颈相比,以二进制形式写入以节省空间(文件大小或内存大小)并没有获得任何显着的优势。

性能不是很高。

从文件加载二进制表示比转换文本表示更有效的想法是正确的。但是,大多数处理器可以比读取二进制数据更快地转换ASCII转换。摘要:删除转换所获得的时间被更大的时间消费者(例如文件I / O和上下文切换)所掩盖。

降低数据的有用性

与二进制表示相比,更多应用程序可以处理浮点数的文本表示。通过文本表示,可以在电子表格,文字处理器和分析工具中轻松使用数据。包含二进制表示的文件需要更多工作。您最后一次尝试将二进制浮点数文件读入电子表格时是什么时候?不要低估数据文件的未来潜力。

优化前的配置文件。

更改数据表示是一种优化形式。优化规则(按重要性顺序)是:

  1. 别。
  2. 仅当程序不适合时 目标机器或用户抱怨 关于速度。
  3. 在程序稳健后进行优化 并正确运行。
  4. 如果可能,优化平台 在优化程序之前。
  5. 如果您需要优化,个人资料 第一即可。
  6. 之前优化要求 优化代码。
  7. 优化设计&算法之前 优化代码。
  8. 优化前优化数据 代码。
  9. 使用高级语言进行优化 在大会写作之前。

答案 1 :(得分:3)

首先,不要这样做。您几乎肯定不需要以二进制格式存储数据。以文本格式存储数据有许多优点。如果您有令人信服的理由以二进制格式存储它们,请重新考虑您的理由。

但是,你问过怎么做,而不是你应该这样做。方法如下:

#include <iostream>
#include <fstream>

int main()
{
   std::ifstream in("in.txt");
   std::ofstream out("out.bin", std::ios::binary);

   double d;
   while(in >> d) {
      out.write((char*)&d, sizeof d);
   }
}

请注意,这并未解决机器类型之间的任何可移植性问题。你可能必须自己解决这个问题。 (我会给你一个提示:解决二进制格式可移植性问题的最佳方法是不要使用二进制格式。)

答案 2 :(得分:2)

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
        char buffer;
    ifstream in("text.txt");
    ofstream out("binaryfile.bin", ios::out|ios::binary);
    int nums[3];
    while (!in.eof())
    {
        in >> nums[0] >> nums[1] >> nums[2];

        out.write(reinterpret_cast<const char*>(nums), 3*sizeof(int));

    }
    return 0;
}

答案 3 :(得分:1)

  

在C ++中,只需打开文件进行读取,然后将其作为二进制文件复制到另一个文件中。

FILE *pTextFile, *pBinaryFile;
char buffer;
pTextFile = fopen("textfile.txt", "r");
pBinaryFile = fopen("binaryfile.bin", "wb");
while (!pTextFile(EOF))
{
fread(buffer, 1, 1, pTextFile);
fwrite(buffer, 1, 1, pBinaryFile);
}
fclose(pTextFile);
fclose(pBinaryFile);

答案 4 :(得分:1)

这是你可能想要做的。

  1. 使用ifstream打开文本文件。
  2. 在二进制模式下使用ofstream打开目标文件。
  3. 从file1读取信息并写入file2。
  4. 一些示例代码(未经测试):

        ifstream ifile("file1.txt");  
        ofstream ofile("file2.txt", ios::binary);  
        string line;  
        while(!ifile.eof()) {  
        getline(ifile, line);  
        ofile.write(line.c_str(), line.length);  
       }
    

    HTH,
    斯利拉姆

答案 5 :(得分:0)

看看std :: ifstream和std :: ofstream。它们可用于读取值和写出值。

答案 6 :(得分:0)

查找stl类istringstream和ofstream。第一个自动将字符串转换为双精度数,第二个有二进制文件输出。在示例中,instream是一个istringstream,os是一个ofstream,后者以正确的模式打开(ios_base :: binary | ios_base :: out)。

while (getline(cin, s)) {
    instream.clear();     // Reset from possible previous errors.
    instream.str(s);      // Use s as source of input.
    if (instream >> myDouble)
       os << myDouble;
}

答案 7 :(得分:0)

binmake个开源C ++工具,允许将文本数据转换为二进制数据。 它目前管理多个数字表示和原始文本(hexa,octal,floats ..)。

我认为在这里提及它很有意思,因为标题处理文本到C ++中的二进制文件 binmake 可以做什么。

它可以用作独立的二进制文件,但也包含在C ++代码中。

作为独立程序使用

使用stdin / stdout

$ echo '32 decimal 32 %x61 61' | ./binmake | hexdump -C
00000000  32 20 61 3d                                       |2 a=|
00000004

使用文件:

$ ./binmake exemple.txt exemple.bin

(见下面的示例视图)

包含在C ++代码中

有一些使用示例:

#include <fstream>
#include "BinStream.h"

using namespace std;
using namespace BS;

int main()
{
    BinStream bin;
    bin << "'hello world!'"
            << "00112233"
            << "big-endian"
            << "00112233";
    ofstream f("test.bin");
    bin >> f;
    return 0;
}

或者

#include <fstream>
#include "BinStream.h"

using namespace std;

int main()
{
    BS::BinStream bin;
    ifstream inf("example.txt");
    ofstream ouf("example.bin");
    bin << inf >> ouf;
    return 0;
}

或者

#include <iostream>
#include "BinStream.h"

using namespace std;
using namespace BS;

int main()
{
    BinStream bin;
    cin >> bin;
    cout << bin;
    return 0;
}

输入文本文件和生成的输出

的示例

档案exemple.txt

# an exemple of file description of binary data to generate
# set endianess to big-endian
big-endian

# default number is hexadecimal
00112233

# man can explicit a number type: %b means binary number
%b0100110111100000

# change endianess to little-endian
little-endian

# if no explicit, use default
44556677

# bytes are not concerned by endianess
88 99 aa bb

# change default to decimal
decimal

# following number is now decimal
0123

# strings are delimited by " or '
"this is some raw string"

# explicit hexa number starts with %x
%xff

生成的二进制输出:

$ ./binmake exemple.txt | hexdump -C
00000000  00 11 22 33 4d e0 77 66  55 44 88 99 aa bb 7b 74  |.."3M.wfUD....{t|
00000010  68 69 73 20 69 73 20 73  6f 6d 65 20 72 61 77 20  |his is some raw |
00000020  73 74 72 69 6e 67 ff                              |string.|
00000027