参考:
https://stackoverflow.com/questions/47952423/how-to-write-text-file-faster-than-fprintf-in-c
针对fprint 写txt耗时久的问题,采用预分配数据、以fwrite写的方式进行优化;
#define BUFFERSIZE 0x8000
unsigned char cache_buf[BUFFERSIZE];
int cache_cnt = 0;
FILE *fp_list;
int file_fd;
void def_putchar(char c) {
cache_buf[cache_cnt] = c;
cache_cnt++;
// Is the buffer full?
if (cache_cnt == BUFFERSIZE) {
// Yes, empty the buffer into the file.
flushBuffer();
}
}
void flushBuffer() {
if (cache_cnt) {
// setvbuf(fp_list, cache_buf, _IOFBF, cache_cnt);
fwrite(cache_buf, cache_cnt, 1, fp_list);
// write(file_fd, cache_buf, cache_cnt);
cache_cnt = 0;
}
}
int def_put_nbr(int nb)
{
if (nb < 0)
{
def_putchar('-');
nb = -nb;
}
if (nb <= 9)
def_putchar(nb + 48);
else
{
def_put_nbr(nb / 10);
def_put_nbr(nb % 10);
}
return (0);
}
写入操作,可参考:
void save_txt(const graph_t * const graph, const char *fname)
{
int i, count = graph->num_edges;
f = fopen(fname, "w");
if (NULL == f) {
fprintf(stderr, "Error opening %s\n", fname);
exit(-1);
}
for (i = 0; i < count; i++) {
def_put_nbr(graph->edges[i].from);
def_putchar(' ');
def_put_nbr(graph->edges[i].to);
def_putchar(' ');
def_put_nbr(graph->edges[i].cost);
def_putchar('\n');
}
flushBuffer();
fclose(f);
}