Como você escreve para um buffer, em seguida, para um arquivo
Pergunta
Eu estou tentando escrever alguns dados STL fora do Matlab e estou tentando fazer isso escrevendo um arquivo MEX (a DLL Matlab escrito em C) No momento eu tenho um loop apenas passando meus dados escrevendo para fora a sintaxe stl com os carros alegóricos.
...
for(m=0;m<colLen;m++)
{
res = m % 3;
if(res == 0)
{
fprintf(fp, "\tfacet normal %f %f %f \n",
normalValues[(x*nvcolLen)+0], normalValues[(x*nvcolLen)+1], normalValues[(x*nvcolLen)+2]);
fprintf(fp,"\t\touter loop\n" );
flag = 0;
x++;
}
fprintf(fp, "\t\t\tvertex ");
for(n=0;n<rowLen;n++)
{
fprintf(fp, "%f ", xValues[m*rowLen+n]);
}
fprintf(fp,"\n");
flag++;
if (flag == 3)
{
fprintf(fp, "\t\tendloop\n\tendfacet\n");
flag = 0;
}
}
...
A principal razão pela qual eu quero fazer isso em um arquivo MEX é porque as coisas são a maneira mais rápida desde a sua compilado. Eu estava lendo um livro C ++, "Sams Teach Yourself C ++ in One nosso um dia" e na página 645 eles falam sobre como usar um buffers para acelerar a escrita para o disco. Uma vez que o buffer enche, escrever os dados, lave-lo, e fazê-lo novamente. Eles realmente não mostram qualquer código sobre como fazer isso e isso é com fluxos de C ++.
Como eu poderia abordar esta em C? Será que eu apenas fazer um char * buffer com um tamanho fixo, e, em seguida, de alguma forma verificar quando o seu pleno e escrevê-lo para um arquivo com fwrite (), lave-lo, começar de novo ??
Solução
Basicamente, de você quiser fazê-lo sozinho, você faria isso quase exatamente como você escreveu: Faça um tampão char*
, controlar o número de caracteres nele (contando os caracteres que você colocar nele) e, se for completa (ou quase completo), lave-lo para o arquivo.
No entanto, este deve realmente não ser um problema com córregos C, como costumam fazer buffering. Você pode até mesmo controlar este buffer com a função setbuf et al.
Outras dicas
fprintf não tamponada saída automaticamente para você. Se há um problema, mostra-nos o código que abre o arquivo (fp).