我有两个非常大的数字(每个最多23位数),我想尽可能快地将它们打印到文件中。文件中的行应如下所示:
number1 [space] number2 [\ n]例如。 123456789999999 99999965454644
我的方法是将行收集到一个大缓冲区中,当缓冲区已满时,使用fwrite()将其写入文件。
最大的问题是,我不知道如何从这两个数字创建一个字符串并将它们保存到一个字符串/ char数组中。正如我所提到的,字符串的长度是可变的,它只能是3个字符甚至50个。
const int OUT_BUFFER_SIZE = 65536;
string out_buffer[OUT_BUFFER_SIZE];
int out_size = 0;
FILE* output_file = fopen("result.out", "w");
void print_numbers(FILE* f, long long num1, long long num2)
{
const int ELEMENT_SIZE = 50;
char line[ELEMENT_SIZE];
sprintf(line, "%lld %lld\n", num1, num2);
out_buffer[out_size] = line;
out_size++;
if (out_size == OUT_BUFFER_SIZE)
{
fwrite(out_buffer, ELEMENT_SIZE, OUT_BUFFER_SIZE, f);
}
}
fclose(output_file);
有没有其他方法可以解决这个问题?感谢。
EDIT1: 我尝试了两种附加方法:
1)使用fprintf(f, "%lld %lld\n", num1, num2);
2)使用ofstream与@somnium提到的完全相同。
我确实测量了它们,令人惊讶的是,1)方法比第二种方法快2倍。
答案 0 :(得分:0)
如果您使用的是C ++而不是普通的C,则可以使用:
#include <iostream>
#include <fstream>
using namespace std;
void print_numbers(const std::string fname, long long num1, long long num2)
ofstream myfile;
myfile.open (fname);
myfile << num1 << " " << num2 << '\n';
myfile.close();
return 0;
}
这已经成为必要的缓冲基础。
答案 1 :(得分:0)
使用“fprintf(f,”%lld%lld \ n“,num1,num2)有什么问题;”? fprintf使用缓冲IO,因此添加另一层缓冲是没有意义的。如果要增加缓冲区大小,可以使用setvbuf()来实现此目的。
但是,最快的方法可能是避免任何缓冲并将所有数据传递给writev(),这需要一组缓冲区用一个系统调用写入。但是,处理部分写入(允许writev这样做)并非易事。